BoxLayout
Inhaltsverzeichnis
Das BoxLayout
Einleitung
Das BoxLayout wurde mit dem Gedanken entwickelt, ihm die Mächtigkeit des GridBagLayout zu geben, ohne dessen Komplexität zu übernehmen. Es hat etwas Ähnlichkeit mit dem FlowLayout und mit ihm ist so gut wie jedes erdenkliche Layout möglich. Jedoch besitzt es den Nachteil, dass für ein großes Layout recht viele Boxen benötigt werden. Deshalb sollte vorher überlegt werden, ob eine Kombination von mehreren anderen LayoutManagern nicht besser geeignet wäre.
Konstanten
Das BoxLayout kann wie alle LayoutManager einfach mit new erzeugt werden. Dazu erwartet es die Komponente, für den das Layout bestimmt ist, sowie die Ausrichtung. Hierbei werden 4 Konstanten verwendet:
X_AXIS = Die Komponenten werden horizontal, ähnlich des FlowLayouts auf einer Zeile von links nach rechts (ohne automatischen Zeilenumbruch) angeordnet. Y_AXIS = Die Komponenten werden vertikal angeordnet. LINE_AXIS und PAGE_AXIS ordnen ebenfalls in die jeweiligen Richtungen an, beachten dabei aber die ComponentOrientation. Damit ist es möglich, die Anordnung an andere Schriftbilder anzupassen. (z. B. von rechts nach links)
<code=java> JPanel boxPanel = new JPanel(); boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.X_AXIS)); </code=java>
oder kurz:
<code=java> JPanel boxPanel = new JPanel(new BoxLayout(boxPanel, BoxLayout.X_AXIS)); </code=java>
Der obige Code setzt ein horizontales BoxLayout für das jeweilige Panel. Wichtig: Soll das BoxLayout auf direkt auf ein Window (wie JFrame) gesetzt werden, muss beachtet werden, dass seit Java 1.5 Methoden wie setLayout() nicht auf das JFrame sondern auf das jeweilige ContentPane (den Container, der bereits im JFrame sitzt) "umgeleitet" werden. Deshalb muss dieses als Parameter übergeben werden.
<code=java> JFrame frame = new JFrame("BoxLayout-Demo"); frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); </code=java>
Um die Erzeugung zu vereinfachen, werden Boxen angeboten. Dabei handelt es sich um Komponenten, die bereits mit dem BoxLayout ausgestattet sind. Diese werden über 2 einfache Factory-Methoden erzeugt:
<code=java> Box hBox = Box.createHorizontalBox(); Box vBox = Box.createVerticalBox(); </code=java>
Unsichtbare Komponenten
Zudem bietet das BoxLayout noch unsichtbare Komponenten zur Ausrichtung an:
Rigid Area = Eine Komponente mit fester Größe. Durch sie ist es z. B. möglich, Komponenten in variablem Abstand anzuordnen.
<code=java> Box hBox = Box.createHorizontalBox(); hBox.add(new JButton("Links")); hBox.add(Box.createRigidArea(new Dimension(10, 0))); hBox.add(new JButton("Mitte")); hBox.add(Box.createRigidArea(new Dimension(15, 0))); hBox.add(new JButton("Rechts")); </code=java>
So entsteht zwischen links und mitte ein Abstand von 10 px., und zwischen mitte und rechts ein Abstand von 15 px.
Glue = Der Glue dehnt sich über den gesamten zu Verfügung stehenden Platz aus. Ein Glue als erste Komponente auf einer mit BoxLayout horizontal ausgerichteten Box würde alle nachfolgenden Komponenten ganz nach rechts "drücken".
<code=java> Box vBox = Box.createVerticalBox(); vBox.add(new JButton("Ganz oben")); vBox.add(Box.createVerticalGlue()); vBox.add(new JButton("Ganz unten")); </code=java>
Es ist empfehlenswert, bei horizontalen Boxen auch einen horizontalen Glue zu verwenden und umgekehrt.
Filler = Sind wie Rigids, nur flexibler, da man minimal, maximal und preferred Size angeben muss.
Die Komponenten werden nach ihrer Preferred Size angeordnet. Zudem werden die alignmentX/Y beachtet. Ich empfehle aber, die Komponenten durch diese unsichtbaren Komponenten anzuordnen. Es macht meiner Meinung nach den Source einfach viel klarer, und ist auch flexibler.
Beispiel
(Dieses Beispiel wäre leicht auch mit anderen Managern realisierbar gewesen, es soll nur die Anwendung zeigen.)
<code=java> import java.awt.Dimension;
import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities;
public class ImageshowFrame extends JFrame {
public ImageshowFrame(String title) { super(title); //Setzt den Fenstertitel per JFrame-Konstruktor. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Beim Betätigen des Schließen-Button Programm beenden. setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); //Setzt ein vertikales Boxlayout als Manager. Box headerBox = Box.createHorizontalBox(); //Erzeugt eine horizontale Box. headerBox.add(new JLabel("Willkommen zur Boxlayout-Demo")); //Fügt ein neues JFrame hinzu. add(headerBox); //Fügt die Box hinzu. Box controlBox = Box.createHorizontalBox(); //Erzeugt eine horizontale Box. controlBox.add(Box.createRigidArea(new Dimension(10, 0))); //Von dem linken Rand bis zum nächsten Komponenten 10 px. Abstand. controlBox.add(new JButton("Zurück")); //Fügt eine Button hinzu. controlBox.add(Box.createHorizontalGlue()); //Alle Komponenten werden von hier aus so weit wie möglich nach links oder rechts "verschoben". controlBox.add(new JButton("Vorwärts")); //Fügt einen Button hinzu. controlBox.add(Box.createRigidArea(new Dimension(10, 0))); //Von dem letzten Komponenten bis zum nächsten (oder Rand) 10 px. Abstand. add(controlBox); //Fügt die Box hinzu. Icon icon = new ImageIcon("bild.png"); //Läd ein Bild. Box iconBox = Box.createHorizontalBox(); //Erzeugt eine horizontale Box. iconBox.add(Box.createHorizontalGlue()); //Fügt einen Glue hinzu. JLabel iconLabel = new JLabel(icon); //Fügt ein neues Label mit dem Icon hinzu. //iconLabel.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight())); //Setzt die Pref. Size des Labels auf die Icongröße. Das ist nicht umbedingt erforderlich. iconBox.add(iconLabel); //Fügt das Label zu der Box hinzu. iconBox.add(Box.createHorizontalGlue()); //Fügt einen Glue hinzu. add(iconBox); //Fügt die Box hinzu. Box printBox = Box.createHorizontalBox(); //Erzeugt eine horizontale Box. printBox.add(Box.createHorizontalGlue()); //Fügt einen Glue hinzu printBox.add(new JButton("Drucken")); //Fügt einen JButton hinzu printBox.add(Box.createHorizontalGlue()); //Fügt einen Glue hinzu add(printBox); //Fügt die Box hinzu. pack(); //Setzt die Größe des JFrames und des Layouts auf die Minimal benötigte Größe. setVisible(true); //Macht das JFrame sichtbar. } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() //Das JFrame soll innerhalb des EDT erzeugt werden. { public void run() { new ImageshowFrame("BoxLayout-Demo"); //Erzeugt das Hauptframe. } }); }
} </code=java>