8.8.8 | Das BoxLayout |
Mit der Einführung von Swing wurden auch zwei neue Layout-Manager entwickelt: das BoxLayout und das SpringLayout, welche im Paket javax.swing zu finden sind.
Das BoxLayout wurde entwickelt, um ähnliche Ergebnisse wie beim GridBagLayout zu erhalten, ohne dessen Komplexität übernehmen zu müssen. Es ordnet Komponenten entlang einer vorgegebenen Linie an, wobei folgende Möglichkeiten zur Verfügung stehen:
- X_AXIS
Die Komponenten werden horizontal von links nach rechts ausgelegt.- Y_AXIS
Die Komponenten werden vertikal von oben nach unten ausgelegt.- LINE_AXIS
Die Komponenten werden wie Wörter auf einer Linie ausgerichtet. Dabei wird aber im Unterschied zu X_AXIS die ComponentOrientation des Container berücksichtigt. Diese gibt an, ob Wörter von oben nach unten (Japanisch) bzw. von rechts nach links (Arabisch) angeordnet sind.Bei einer horizontalen Ausrichtung werden die Komponenten dann von links nach rechts ausgerichtet, ansonsten von rechts nach links. Wenn eine vertikale Ausrichtung vorliegt, werden die Komponenten immer von oben nach unten ausgerichtet.
- PAGE_AXIS
Im Gegensatz zur ComponentOrientation werden bei dieser Variante die Komponenten vertikal oder horizontal ausgelegt, wobei die Ausrichtung innerhalb der Achse gleich bleibt, so dass bei uns die Komponenten von oben nach unten ausgerichtet werden.Bei einer horizontalen Ausrichtung werden die Komponenten immer von oben nach unten ausgelegt. Bei vertikaler Ausrichtung werden die Komponenten von links nach rechts bzw. von rechts nach links ausgerichtet, genauso, wie ComponentOrientation es definiert.
Das BoxLayout versucht, die Komponenten gemäß der preferredSize anzuordnen. Füllen die Komponenten nicht den gesamten zur Verfügung stehenden Platz aus, wird die Ausrichtung durch das alignmentX bzw. alignmentY der Komponenten bestimmt. Dieser Wert kann über die Methoden setAlignmentX(float alignment) bzw. setAlignmentY(float alignment) eingestellt werden. Der Wert darf zwischen dem Bereich 0.0f und 1.0f liegen, wobei die folgenden Konstanten verwendet werden können:
- 0.0f - links bzw. oben am Rand, definiert durch die Konstanten Component.LEFT_ALIGNMENT und Component.TOP_ALIGNMENT),
- 0.5f - zentriert (Standard), wird definiert durch die Konstante Component.CENTER_ALIGNMENT,
- 1.0f - rechts bzw. unten am Rand, wird definiert durch die Konstanten Component.RIGHT_ALIGNMENT und Component.BOTTOM_ALIGNMENT).
Um die Verwendung des BoxLayout zu vereinfachen, gibt es die Klasse Box, die eine Komponente mit einem BoxLayout darstellt. Kombiniert man verschiedene Box Container miteinander, kann man schnell ansprechende Oberflächen erstellen.
Neben den oben erwähnten Möglichkeiten des BoxLayouts bietet die Box drei Konstrukte, um unsichtbare Komponenten zur Ausrichtung zu verwenden:
- Rigid Area
Eine unsichtbare Komponente, die eine feste Größe hat. Die Methode Box.createRigidArea(Dimension size) erzeugt eine solche Komponente.- Glue
Ein Glue kann entweder horizontal oder vertikal ausgerichtet sein (einzustellen mit Box.createHorizontalGlue() oder Box.createVerticalalGlue()) und nimmt sämtlichen überschüssigen Platz ein. Ein Glue zwischen zwei Komponenten bewirkt also, dass der maximal mögliche Abstand zwischen ihnen vorherrscht.- Box.Filler
Über den Konstruktor new Box.Filler(Dimension minSize, Dimension prefSize, Dimension maxSize) kann eine nach eigenen Angaben gestaltete Komponente erzeugt werden, die sich gemäß der angegebenen Dimension skaliert. Möchte man beispielsweise, dass der Filler so viel Platz wie möglich einnimmt (wie beim glue), so kann man dies durch Setzen von new Dimension(Short.MAX_VALUE, Short.VALUE) als maxSize erreichen.
getContentPane().setLayout (new BorderLayout()); Box box = Box.createVerticalBox(); JLabel label = new JLabel("Auswahl"); box.add(label); label.setAlignmentY(Component.LEFT_ALIGNMENT); label.setAlignmentX(Component.LEFT_ALIGNMENT); box.add(Box.createVerticalStrut(5)); JScrollPane scrollPane = new JScrollPane( new JList(new String[] { "Äpfel","Orangen","Birnen","Bananen" })); scrollPane.setAlignmentX(LEFT_ALIGNMENT); box.add(scrollPane); box.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); getContentPane().add(box, BorderLayout.CENTER); box = Box.createHorizontalBox(); box.add(Box.createHorizontalGlue()); JButton okButton = new JButton("Ok"); getRootPane().setDefaultButton(okButton); box.add(okButton); box.add(Box.createHorizontalStrut(5)); box.add(new JButton("Cancel")); box.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); getContentPane().add(box, BorderLayout.SOUTH);