Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


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.

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.

Breite des Anzeigebereichs

Das Datenelement GridBagConstraints.gridwidth definiert die Anzahl an Gitterzellen, über die sich der Anzeigebereich horizontal erstreckt. Hierbei gibt es zwei wichtige vordefinierte Konstanten:
GridBagConstraints.REMAINDERVergibt den Rest der aktuellen Zeile an die Komponente.
GridBagConstraints.RELATIVEOrdnet die Komponente direkt unter der vorhergehenden in der nächsten Zeile an.
Alternativ können auch absolute Werte angegeben werden.

Höhe des Anzeigebereichs

Das Element GridBagConstraints.gridheight definiert die Anzahl an Gitterzellen, über die sich der Anzeigebereich vertikal erstreckt. Hierbei gibt es zwei wichtige vordefinierte Konstanten:
GridBagConstraints.REMAINDERVergibt den Rest der aktuellen Spalte an die Komponente.
GridBagConstraints.RELATIVEOrdnet die Komponente direkt neben der vorhergehenden in der nächsten Spalte an.
Alternativ können auch absolute Werte angegeben werden.

Festlegung der Position

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.

Anordnung im Anzeigebereich

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.

Füllung der Gitterzellen

Im Element GridBagConstraints.fill kann spezifiziert werden, ob und wie die Komponente ihren Anzeigebereich ausfüllt:
GridBagConstraints.NONEDie Komponente wird in ihrer bevorzugten Größe dargestellt.
GridBagConstraints.HORIZONTALDie Komponente wird so verbreitert, dass sie die Breite des Anzeigebereichs voll ausfüllt.
GridBagConstraints.VERTICALDie Höhe der Komponente wird so verändert, dass sie die Höhe des Anzeigebereichs voll ausfüllt.
GridBagConstraints.BOTHDie Höhe und die Breite der Komponente werden so verändert, dass sie den Anzeigebereich voll ausfüllt.

Aufteilung des Platzes

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.

Zusätzliche Abstände

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.

Ein Beispiel

Abbildung 8.62: Pizza-Service mit GridBagLayout
Abbildung 8.62


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:
  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 mit
  GridBagConstraints 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 );


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.