BoxLayout kennenlernen

Einer der Standard-Layout-Manager, die mit der Java-Plattform geliefert werden, ist BoxLayout. Auf diese Weise können Sie eine einzelne Zeile oder Spalte von Komponenten in einem Container anordnen. Das klingt vielleicht nach einem nicht so komplizierten Layout-Manager, aber mit Hilfe von Boxund seinem Kleber und seinen Streben würde man denken, dass das ausreichen würde, aber es gibt noch mehr. Die vertikale und horizontale Ausrichtung der darunter liegenden Komponenten ermöglicht eine noch bessere Kontrolle der Positionierung der Komponenten innerhalb des Containers. Hier werden wir uns all diese Aspekte ansehen.

Typische Verwendung

BoxLayout unterscheidet sich von den meisten Layout-Managern, bei denen Sie lediglich den Layout-Manager erstellen und den Layout-Manager mit dem verknüpfen müssen Container. Stattdessen BoxLayoutmüssen Sie Containerden Konstruktor an den Konstruktor des Layout-Managers übergeben, damit in jedem von ihnen ein Verweis auf die andere Komponente vorhanden ist. Dies kann umständlich manchmal sein, und macht die Verwendung des BoxBehälters immer beliebter, da alles , was Sie tun müssen , ist ein horizontal fragen oder vertikal angeordnet , um Boxdurch eine ihrer staticMethoden:

 Box vertical = Box.createVerticalBox(); Box horizontal = Box.createHorizontalBox();

Beide werden BoxLayoutunter der Abdeckung verwendet und platzieren zusätzliche Komponenten je nach Richtung am richtigen Zugang. Ein vertikales Feld platziert alles in einer einzelnen Spalte, während ein horizontales Feld alles in einer Reihe platziert. Das Vergleichen BoxLayout(und damit Box) mit GridLayouterfordert einen kurzen Kommentar. Wenn Sie eine Reihe von Komponenten in einen GridLayoutkontrollierten Behälter legen , wird erwartet, dass alle Komponenten dieselbe Größe haben. Dies BoxLayoutist nicht der Fall und die maximal bevorzugte Größe der Komponente wird berücksichtigt.

Streben und Kleber

Die Box-Klasse bietet die Erstellung von zwei Stützkomponenten, eine Strebe oder einen Füllbereich mit fester Größe, der andere Kleber für einen erweiterbaren Bereich. Mit diesen können Sie Komponenten mit Klebstoff in einem Behälter platzieren, entweder in einem festen Abstand mit einer Strebe oder in einem Wachstums- / Schrumpfbereich, der auf dem verfügbaren Platz basiert. Die gleiche Aufgabe kann mit GridBagConstraintsund GridBagLayout, wenn auch nicht so einfach , erledigt werden.

Zur Demonstration erstellt dieses erste Programm eine 25-Pixel-Strebe zwischen den beiden oberen Komponenten und eine 10-Pixel-Strebe zwischen den beiden unteren Komponenten.

import java.awt.*; import javax.swing.*; public class VerticalBoxTest { public static void main(String args[]) { JFrame frame = new JFrame("Vertical Box"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Box box = Box.createVerticalBox(); box.add(new Button("Top")); box.add(Box.createVerticalStrut(25)); box.add(new Button("Middle")); box.add(Box.createVerticalStrut(10)); box.add(new Button("Bottom")); frame.add(box, BorderLayout.CENTER); frame.setSize(300, 200); frame.setVisible(true); } }

Beachten Sie nach dem Kompilieren und Ausführen, wie sich die Größe der Komponenten ändert, wenn die Fenstergröße zunimmt oder abnimmt. Der Abstand zwischen den Komponenten bleibt unverändert, um dem reservierten Strebenraum zu entsprechen. In diesem Beispiel wird a Buttonanstelle von a verwendet JButton, um eine Erklärung der Komponentenausrichtung bis etwas später zu vermeiden.

Das Arbeiten mit einer horizontalen Box und einem Kleber führt zu ähnlichen Ergebnissen, obwohl der Kleber diesmal größer wird, um zusätzlichen Platz für die Strebe einzunehmen, anstatt eine feste Größe beizubehalten.

import java.awt.*; import javax.swing.*; public class HorizontalBoxTest { public static void main(String args[]) { JFrame frame = new JFrame("Horizontal Box"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Box box = Box.createHorizontalBox(); box.add(Box.createHorizontalGlue()); box.add(new JButton("Left")); box.add(new JButton("Right")); frame.add(box, BorderLayout.NORTH); box = Box.createHorizontalBox(); box.add(new JButton("Left")); box.add(Box.createHorizontalGlue()); box.add(new JButton("Right")); frame.add(box, BorderLayout.CENTER); box = Box.createHorizontalBox(); box.add(new JButton("Left")); box.add(new JButton("Right")); box.add(Box.createHorizontalGlue()); frame.add(box, BorderLayout.SOUTH); frame.setSize(300, 200); frame.setVisible(true); } }

Der Versuch, Sie nicht zu sehr zu verwirren, aber das Beispiel ist die Verwendung von JButtonKomponenten.

Ausrichtung

Das Leben wird interessant, Box/BoxLayoutwenn die Komponenten im Container eine andere Größe haben oder die Höhe / Breite des Containers breiter als für eine vertikale Box erforderlich oder höher als für eine horizontale Box ist. Mit anderen Worten, wenn Sie eine hohe Säule haben, wo landen Komponenten mit einer anderen Breite? Und wenn Sie eine breite Reihe mit Bauteilen unterschiedlicher Höhe haben, wie wäre es dann damit?

Hier kommen die unterschiedlichen Ausrichtungen einer Komponente ins Spiel. Jede Swing-Komponente hat dank ihrer und Methoden eine X-alignmentEinstellung und eine Y-alignmentEinstellung . Der Bereich jeder Einstellung reicht von bis einschließlich, wobei die Ausrichtung nach links oder oben und die Ausrichtung nach rechts oder unten in Abhängigkeit von der Richtung von dargestellt wird . In der Klasse sind Konstanten verfügbar, sodass Sie nicht wirklich wissen müssen, welche Werte für die Ausrichtung nach rechts und links gelten. Es ist jedoch hilfreich zu wissen, ob Sie etwas dazwischen möchten.get/setAlignmentX()get/setAlignmentY()01.001BoxLayoutComponent

Um die rechte, linke und mittlere Natur von Schaltflächen unterschiedlicher Größe in einem vertikalen Feld zu demonstrieren, erstellt das folgende Programm drei Felder, von denen jedes mit links, mittig und rechts ausgerichteten Schaltflächen gefüllt ist.

import java.awt.*; import javax.swing.*; public class AlignX { private static Container makeIt(String labelChar, float alignment) { Box box = Box.createVerticalBox(); for (int i=1; i<6; i++) { String label = makeLabel(labelChar, i*2); JButton button = new JButton(label); button.setAlignmentX(alignment); box.add(button); } return box; } private static String makeLabel(String s, int length) { StringBuffer buff = new StringBuffer(length); for (int i=0; i
    

Now, let us mix things up a little and have one vertical box with three buttons, one for each alignment. The screen width will be wide, to make sure there is extra space available. Conceptually thinking, one would expect the component with left alignment to be aligned to the left of the container and the one with right alignment to be aligned to the right of the container. That would be wrong though. When there are different component alignments, they are aligned to the center of the container. So, for left alignment, that component will have its left edge on the invisible center line of the container. For right alignment, it is the right edge.

Here's the program to demonstrate:

import java.awt.*; import javax.swing.*; public class AlignX2 { public static void main(String args[]) { JFrame frame = new JFrame("X Alignment"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Box box = Box.createVerticalBox(); JButton button = new JButton("LL"); button.setAlignmentX(Component.LEFT_ALIGNMENT); box.add(button); button = new JButton("CC"); button.setAlignmentX(Component.CENTER_ALIGNMENT); box.add(button); button = new JButton("RR"); button.setAlignmentX(Component.RIGHT_ALIGNMENT); box.add(button); frame.add(box, BorderLayout.CENTER); frame.setSize(300, 200); frame.setVisible(true);} } 

And, the corroborating screen:

Working in the other direction has top alignment aligning the top of the component to the imaginary center line, or in other words below the center.

Mixing up alignments in this fashion works fine, but just takes some getting used to, as the alignment isn't necessarily where you would expect it to be, unless all the alignments are the same, and then it does align to the container border, as opposed to the container center line.

If you are still confused, feel free to modify the earlier programs and try even more combinations of x and y alignment. Of course, if all this baffles you, there is always GridBagLayout.

******

SDN Chat: Meet the Writers of java.sun.com

Please join us in Sun's Developer Playground in Second Life on Thursday, February 14 at 10am PST to meet the writers of java.sun.com. Ed Ort, Dana Nourie, Janice Heiss, and Laureen Hudson will be inworld to discuss their adventures in writing for one of the industry's most popular websites and to share the technologies and trends they'll be keeping their eyes on in 2008. And, for the first time, SMI Press is pleased to offer attendees one of three new SMI Press books for free!

This story, "Getting to Know BoxLayout" was originally published by JavaWorld .