Literatur

BoxLayout

Das BoxLayout sieht auf den ersten Blick aus, wie eine Variante des FlowLayouts: Elemente können nur nebeneinander stehen oder nur untereinander (siehe Quellcode). Zeilen- (bzw. Spalten-)umbrüche gibt es weder zur Designzeit noch zur Laufzeit.

Somit ahnen wir schon: auch das BoxLayout ist nicht dazu geeignet, das Userinterface für ein ganzes Programm zur Verfügung zu stellen. Dennoch bietet es in manchen Situationen einen entscheidenden Vorteil: Sie können sich darauf verlassen, dass die Elemente, die Sie im BoxLayout angeordnet haben, immer nebeneinander (bzw. untereinander) erscheinen, und zwar völlig unabhängig davon, wie der Benutzer die Bildschirmmaske skaliert! Denken Sie auch daran, dass „Elemente“ selbst wieder Container (wie bspw. das JPanel) sein können.

Fazit: Durch seine bewusst unflexible Art Elemente anzuordnen ist das BoxLayout geeignet, als Komponente in einem umfassenderen Layout-Manager aufzutreten (wie etwa Border oder GridBag), und einen Teil Ihres GUI darzustellen, für den Sie eine starre Zeilen- bzw. Spaltenform benötigen oder wünschen.

BoxLayout Beispiel

Hier wird das FlowLayout-Beispiel umgeschrieben zu einem (vertikalen, sonst wäre ja fast nichts anders) BoxLayout. Wenn Sie es laufen lassen, beachten Sie, wie manche Elemente skalieren, wenn Sie die Fenstergröße verändern, die Anmutung der Spaltenform aber strikt erhalten bleibt:

 
package gui;
 
/**
 * Demo für den Layout-Manager BoxLayout.
 * 
 * Wenn Sie dieses Codebeispiel zum Laufen bringen wollen, beachten Sie, dass 
 * Sie den Quelltext in einer Datei namens BoxLayoutDemo.java speichern 
 * (Achtung auf Groß-und Kleinschreibung) und dass sich die Datei in einem 
 * Unterordner „gui“ unter Ihrem Projektordner befinden muss.
 *
 * Die meisten Swing-Formulare leiten javax.swing.JFrame ab.
 * 
 * @author phaidros
 */
public class BoxLayoutDemo extends javax.swing.JFrame {
 
    // Die Objektvariablen für die Elemente auf dem JFrame:
 
    // Auf dem JPanel wird alles angeordnet. 
    // Es ist das Element, dem das Box-Layout zugewiesen wird
    private javax.swing.JPanel jPanel1 = new javax.swing.JPanel();
 
    // Die sichtbaren Elemente werden als Objektvariablen angelegt:
    private javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
    private javax.swing.JButton jButton1 = new javax.swing.JButton();
    private javax.swing.JLabel jLabel2 = new javax.swing.JLabel();
    private javax.swing.JTextField jTextField1 = new javax.swing.JTextField();
 
    /**
     * Der Konstruktor.
     */
    public BoxLayoutDemo() {
 
        // Was soll bei Klick auf das System-X rechts oben passieren:
        // Das Programm soll gänzlich beendet werden.
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 
        // Das JPanel bekommt sein Layout. Hier wird festgelegt, ob es 
        // horizontal oder vertikal orientiert sein soll:
        jPanel1.setLayout( new javax.swing.BoxLayout(
                jPanel1, javax.swing.BoxLayout.Y_AXIS ) );
 
        // Das JLabel beschriften...
        jLabel1.setText ( "1. ein JLabel" );
        // ...und dem JPanel zuweisen
        jPanel1.add ( jLabel1 );
 
        // Den JButton beschriften...
        jButton1.setText ( "2. ein JButton" );
 
        /** 
         * Der Vollständigkeit halber fügen wir einen ActionListener ein –
         * hier ausgeführt als innere Klasse. Aber das ist nicht das Thema
         * dieses Code-Beispiels.
         */
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
 
        // ...und dem JPanel zuweisen
        jPanel1.add ( jButton1 ) ;
 
        // Das Gleiche für jTextField1 und jLabel2:
        jTextField1.setText ( "3. ein JTextField" ) ;
        jPanel1.add ( jTextField1 ) ;
 
        jLabel2.setText ( "4. wieder ein JLabel usw." ) ;
        jPanel1.add ( jLabel2 ) ;
 
        // Das Panel zum aktiven, sichtbaren Inhalt des JFrame machen:
        this.getContentPane().add ( jPanel1 ) ;
 
        // Alle Elemente auf kleinstmögliche Größe bringen
        pack();
    }
 
    /**
     * Die Listener-Methode des JButton.
     * Wird von der oben implementierten ActionListener-Klasse aufgerufen.
     */
    private void jButton1ActionPerformed( java.awt.event.ActionEvent evt ) {
        // TODO add your handling code here:
    }
 
    /*
     * Jedes Java-Programm beginnt bei einer Methode main() zu laufen, so auch 
     * dieses. Beachten Sie, dass die Methode main() in jeder beliebigen 
     * Klasse stehen könnte, die Zugriff auf BoxLayoutDemo hat, also auch in 
     * ihr selbst – also hier:
     */
    public static void main(String args[]) {
        // Ein Objekt der Klasse erzeugen und sichtbar machen.
        new BoxLayoutDemo().setVisible ( true );
    }
}

Text, Code und Bilder © Phaidros (Gast-Autor)