Literatur

FlowLayout

Das Flow-Layout ist eines jener Layout-Manager, die dem Programmierer die Gestaltung völlig aus der Hand nehmen: der Layout-Manager allein entscheidet, wo er ein Element anordnet, man hat keine Möglichkeit der Beeinflussung.

Dabei geht das Flow Layout ähnlich vor wie eine Textverarbeitung mit Fließtext: jedes Element wird – ähnlich wie ein Wort in der Textverarbeitung – rechts neben das vorher platzierte in eine Zeile gesetzt.

FlowLayout Screenshot 1

Wenn ein Element keinen Platz mehr hat, wird eine neue Zeile begonnen. Dieses Prinzip gilt auch während der Laufzeit, kann sich also an Fensterveränderungen anpassen (siehe Anmerkung unten). Ein Bild sagt mehr als 1000 Worte:

FlowLayout Screenshot 2
FlowLayout Screenshot 3
FlowLayout Screenshot 4

Was sich hier etwas eigenartig liest und vielleicht auch so aussieht, kann aber durchaus sinnvoll eingesetzt werden: denken Sie an ein Border-Layout, das im oberen Bereich eine Art Buttonleiste anzeigen soll. Ein Flow-Layout für das JPanel im oberen Bereich („North“), auf das man JButtons verteilt, eignet sich hervorragend dafür.

Anmerkung: Falls Sie in netbeans mit dem graphischen Editor „matisse“ arbeiten und ein JPanel benützen (siehe Tipp im Anschluss) müssen Sie sicherstellen, dass die Eigenschaften „Horizontal Resizable“ und „Vertical Resizable“ gesetzt sind, damit man das Flow-Layout arbeiten sehen kann!

Und hier der angekündigte Tipp: Man gewinnt generell sehr viel Flexibilität in der künftigen Gestaltung seiner Oberflächen, wenn man seine Elemente nicht direkt auf das JFrame setzt, sondern immer nur auf ein JPanel, in dem man so sein Userinterface aufbaut und es abschließend als einziges Element auf das JFrame platziert.

Fazit: das FlowLayout werden Sie nicht benützen, um damit eine ganze Bildschirmmaske zu designen, aber eingebettet als Element in etwas Größeres kann es gute Dienste tun.

Und mit diesem Quellcode wurde das obige Beispiel erzeugt:

 
package gui;
 
/**
 * Demo für den Layout-Manager FlowLayout.
 * 
 * Wenn Sie dieses Codebeispiel zum Laufen bringen wollen, beachten Sie, dass 
 * Sie den Quelltext in einer Datei namens FlowLayoutDemo.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 FlowLayoutDemo 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 Flow-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 FlowLayoutDemo() {
 
        // 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);
 
        // Beachten Sie, dass Swing gar nicht so selten auf Elemente der 
        // Vorgänger-Bibliothek 'awt' zugreift. Auch Das FlowLayout gehört 
        // eigentlich zum awt. Das JPanel bekommt sein Layout:
        jPanel1.setLayout( new java.awt.FlowLayout() );
 
        // Das JLabel beschriften…
        jLabel1.setText ( "1. ein JLabel" );
        // …und dem JPanel zuweisen
        jPanel1.add ( jLabel1 );
 
        // Den JButton beschriften…
        jButton1.setText ( "2. einjButton" );
 
        /** 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 implementierte 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 FlowLayoutDemo hat, also auch in 
     * ihr selbst – also hier:
     */
    public static void main(String args[]) {
        // Ein Objekt der Klasse erzeugen und sichtbar machen.
        new FlowLayoutDemo().setVisible ( true );
    }
}

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