8.8.7 | Das GridBagLayout |
Das GridBagLayout basiert wie das GridLayout auf einem Gitter. Allerdings ist der GridBagLayout-Manager erheblich flexibler. Er bietet unter anderem folgende Möglichkeiten:Die Einstellung dieser Eigenschaften erfolgt mit Exemplaren der Klasse GridBagConstraints, die im awt-Paket definiert ist. Hierzu müssen die Elemente eines GridBagConstraints-Objekts in der gewünschten Weise belegt werden. Um die Belegung zu vereinfachen, stellt GridBagConstraints einige Konstanten bereit.
- Eine Komponente kann sich über einen Anzeigebereich von mehreren Gitterzellen erstrecken.
- Spalten und Zeilen können unterschiedlich breit bzw. hoch sein.
- Eine Komponente kann die ihr zugewiesenen Gitterzellen voll ausfüllen oder aber in ihrer normalen Größe dargestellt werden.
- Wenn sie in ihrer normalen Größe dargestellt wird, kann angegeben werden, wie sie innerhalb der zugewiesenen Gitterzellen angeordnet wird.
- Falls die Größe des Containers vom Benutzer verändert wird, kann angegeben werden, zu welchen Anteilen die Höhen-/Breitenänderung auf die einzelnen Gitterzeilen und -spalten verteilt wird. So kann beispielsweise spezifiziert werden, dass sich Änderungen der Höhe eines Fensters ausschließlich auf die Höhe einer bestimmten Gitterzeile auswirken und alle anderen Gitterzeilen eine feste Höhe haben.
Erzeugt man ein GridBagConstraints-Objekt und beläßt man alle Elemente mit ihren Standardwerten, so sieht der betreffende Container genauso aus, als hätte man ein GridLayout verwendet. Zur Ausnutzung der besonderen Fähigkeiten vom GridBagLayout ist also die Modifikation der Elemente von GridBagConstraints zwingend erforderlich.
Die Verknüpfung einer Komponente mit einem bestimmten Exemplar von GridBagConstraints kann auf zwei Arten erfolgen:Der Dialog in Abbildung 8.62 wurde mit dem GridBagLayout erstellt.
- GridBagLayout definiert die Methode setConstraints(). Ihr wird eine Komponente und das zugehörige Exemplar von GridBagConstraints übergeben.
Seit Version 1.1 ist GridBagLayout vom Interface LayoutManager2 abgeleitet, wodurch es möglich ist, die Komponente direkt beim Hinzufügen in einen Container mit einem GridBagConstraints-Objekt zu verknüpfen, indem die add()-Variante add(Component, Object) benutzt wird. Daher ist es in der Regel nicht mehr erforderlich, setConstraints() direkt aufzurufen.
Das Datenelement GridBagConstraints.gridwidth definiert die Anzahl an Gitterzellen, über die sich der Anzeigebereich horizontal erstreckt. Hierbei gibt es zwei wichtige vordefinierte Konstanten:Alternativ können auch absolute Werte angegeben werden.
GridBagConstraints.REMAINDER Vergibt den Rest der aktuellen Zeile an die Komponente. GridBagConstraints.RELATIVE Ordnet die Komponente direkt unter der vorhergehenden in der nächsten Zeile an.
Das Element GridBagConstraints.gridheight definiert die Anzahl an Gitterzellen, über die sich der Anzeigebereich vertikal erstreckt. Hierbei gibt es zwei wichtige vordefinierte Konstanten:Alternativ können auch absolute Werte angegeben werden.
GridBagConstraints.REMAINDER Vergibt den Rest der aktuellen Spalte an die Komponente. GridBagConstraints.RELATIVE Ordnet die Komponente direkt neben der vorhergehenden in der nächsten Spalte an.
Zur Positionierung gibt es die Elemente GridBagConstraints.gridx und GridBagConstraints.gridy. Sie legen die obere linke Gitterzelle des Anzeigebereichs fest. Der voreingestellte Wert GridBagConstraints.RELATIVE ordnet die Komponente neben bzw. unter der zuvor eingefügten Komponente an. Ansonsten werden absolute Werte angegeben.
Das Element GridBagConstraints.anchor erlaubt die Festlegung der Position einer Komponente innerhalb ihres Anzeigebereichs, falls sie diesen nicht voll ausfüllt. Mögliche Werte sind GridBagConstraints.CENTER sowie acht Richtungskonstanten: GridBagConstraints.NORTH bis GridBagConstraints.NORTHWEST.
Im Element GridBagConstraints.fill kann spezifiziert werden, ob und wie die Komponente ihren Anzeigebereich ausfüllt:
GridBagConstraints.NONE Die Komponente wird in ihrer bevorzugten Größe dargestellt. GridBagConstraints.HORIZONTAL Die Komponente wird so verbreitert, dass sie die Breite des Anzeigebereichs voll ausfüllt. GridBagConstraints.VERTICAL Die Höhe der Komponente wird so verändert, dass sie die Höhe des Anzeigebereichs voll ausfüllt. GridBagConstraints.BOTH Die Höhe und die Breite der Komponente werden so verändert, dass sie den Anzeigebereich voll ausfüllt.
Zur Aufteilung des Platzes gibt es die Elemente GridBagConstraints.weightx und GridBagConstraints.weighty. Sie ermöglichen eine gewichtete Verteilung des vorhandenen Platzes auf die einzelnen Gitterzellen. Dies ist insbesondere bei der Änderung der Größe des Containers von Bedeutung. Das Gewicht ist üblicherweise eine Dezimalzahl zwischen dem Standardwert 0.0 und 1.0. Es sind aber auch größere Werte zulässig. Der Wert 0.0 für GridBagConstraints.weightx bedeutet, dass zusätzlicher Raum, der bei einer Verbreiterung des Containers entsteht, ausschließlich zur Verbreiterung des Gitters zwischen den Gitterzellen verwendet wird. Die Komponente erhält also keinen zusätzlichen Raum. Der andere Extremwert 1.0 dagegen bewirkt das Gegenteil. Hier erhält die Komponente den gesamten zusätzlichen Platz; das Gitter behält seine Breite.
Mit dem Element GridBagConstraints.insets kann an den Rändern des Anzeigebereichs der Komponente zusätzlicher Zwischenraum eingefügt werden. Mit GridBagConstraints.ipadx und GridBagConstraints.ipady kann der Mindestplatzbedarf einer Komponente beeinflußt werden.
Material zum Beispiel
Einige ausgewählte Felder sollen anhand des in Abbildung 8.62 gezeigten Dialogs erläutert werden. Der Titel des Dialogs soll sich über die volle Breite des Containers erstrecken. Daher wird die Breite auf GridBagConstraints.REMAINDER gesetzt. Allerdings soll der Text einen gewissen Abstand zum linken und rechten Rand einhalten. Dies wird mit einer entsprechenden Zuweisung an das Element insets erzielt. Darüber hinaus soll die Höhe zwei Gitterzellen betragen. Der Titel mit der folgenden Sequenz erzeugt:
- Applet starten
- Quelltexte:
constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.gridheight = 2; constraints.insets = new Insets( 0, 5, 0, 5); Label header = new Label( "Benno's Pizza Service" ); header.setFont(new Font("Helvetica", Font.BOLD, 16 )); insertComponent( header, constraints );Hierzu wurde zuvor mitGridBagConstraints constraints = new GridBagConstraints();ein Exemplar von GridBagConstraints erzeugt. Dieses Exemplar kann dann durchgehend weiterverwendet werden, wobei gegebenenfalls darauf zu achten ist, veränderte Felder für die nächste Komponente wieder zurückzusetzen. Falls viele Parameter eingestellt werden, ist es unter Umständen einfacher, ein neues Exemplar zu erzeugen, das wieder mit den Initialwerten belegt ist. Das Label der Eingabezeile soll ebenfalls alleine in seiner Zeile stehen. Allerdings soll es linksbündig erscheinen. Deswegen muss das Element anchor entsprechend eingestellt werden:constraints.gridheight = 1; constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.anchor = GridBagConstraints.WEST; insertComponent( new Label( "Name:" ), constraints );Der Eingabezeile wird ebenfalls mit dem Wert GridBagConstraints.REMAINDER eine volle Gitterzeile eingeräumt. Damit sie diesen Platz voll ausfüllt, wird das Element fill auf GridBagConstraints.HORIZONTAL gesetzt:constraints.fill = GridBagConstraints.HORIZONTAL; constraints.insets = new Insets( 0, 5, 0, 5); insertComponent( new TextField( "" ), constraints );Die weiteren Komponenten sollen in zwei Spalten gleicher Breite angeordnet werden, die auch beim Vergrößern des Fensters gleich breit bleiben sollen. Hierzu wird das Element weightx für beide Spalten auf den Wert 1.0 gesetzt. Damit die Labels nebeneinander erscheinen, erhält das Feld gridwidth des ersten Labels den Wert GridBagConstraints.RELATIVE, um anzuzeigen, dass eine neue Zeile begonnen werden soll. Die Breite des zweiten Labels wird dann wieder auf GridBagConstraints.REMAINDER gesetzt.constraints.weightx = 1.0; constraints.gridwidth = GridBagConstraints.RELATIVE; insertComponent( new Label( "Sorte:" ), constraints ); constraints.gridwidth = GridBagConstraints.REMAINDER; insertComponent( new Label( "Extras:" ), constraints );Entsprechend werden die Checkboxen eingefügt. Das Eingabefeld erstreckt sich über eine Spalte und zwei Zeilen, und es soll diesen Bereich auch voll einnehmen.constraints.gridwidth = 1; constraints.gridheight = 2; constraints.fill = GridBagConstraints.BOTH; constraints.insets = new Insets( 0, 5, 0, 5); insertComponent( new TextField(), constraints );Die nächsten beiden Komponenten werden automatisch daneben positioniert, wenn die Höhe auf Eins und die Breite auf GridBagConstraints.REMAINDER gesetzt wird. Beide Komponenten sollen zentriert und in ihrer natürlich Größe dargestellt werden.constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.gridheight = 1; constraints.anchor = GridBagConstraints.CENTER; constraints.fill = GridBagConstraints.NONE; insertComponent( new Checkbox( "Abholer" ), constraints ); insertComponent( new Button( "Löschen" ), constraints );