8.8.1 | Sinn und Zweck der Layout-Manager |
Es gibt grafische Oberflächen, bei denen die Anordnung der Komponenten grundsätzlich über die Angabe absoluter Koordinaten in Pixeln erfolgt. Diese Vorgehensweise ist aber aus mehreren Gründen unvorteilhaft:
- Absolute Angaben sind sehr unflexibel. Beim Einfügen weiterer Komponenten müssen die Positionen anderer Komponenten angepasst werden, was mit erheblichem Aufwand verbunden sein kann. Die Layout-Manager nehmen dem Benutzer die Arbeit der absoluten Positionierung ab. Der Benutzer macht lediglich qualitative Angaben wie »diese Komponente soll links von einer anderen stehen« (BorderLayout) oder »alle Komponenten sollen untereinander stehen« (GridLayout).
- Auch um die Größe der Komponenten braucht der Benutzer sich nicht zu kümmern. Jede Java-Komponente besitzt die Methoden getMinimumSize() und getPreferredSize(); sie geben die Mindestgröße bzw. die bevorzugte Größe an, mit der eine Komponente dargestellt werden »will«. Bei Buttons richten sich diese Maße beispielsweise nach der Breite des Textes, mit dem sie beschriftet sind. Wenn der Layout-Manager einen Container bearbeitet, berücksichtigt er die Rückgabewerte dieser Methoden bei allen enthaltenen Komponenten. Mit diesem Zusammenspiel wird dem Benuzer die Festlegung der Größe von Komponenten erspart. Andererseits kann er aber auch gezielt eingreifen, indem er die Methoden getMinimumSize() und getPreferredSize() überschreibt.
- Durch die Vermeidung absoluter Größenangaben ist es möglich, dass eine Komponente ihre Größe beim Verändern der Container-Größe anpassen kann (GridBagLayout). So könnte ein Texteingabefeld stets das gesamte Fenster ausfüllen, in das es eingebettet ist, wenn der Benutzer dessen Größe ändert.
- Der gravierendste Nachteil ist, dass das Erscheinungsbild eines Dialogs mit absoluten Koordinaten auf verschiedenen Plattformen stark variieren kann. Ein häufiger Effekt unter Motif ist beispielsweise ein »Abschneiden« des Textes von Eingabefeldern, wenn die Oberfläche unter Windows entworfen wurde. Sogar auf derselben Plattform können bei verschiedenen Auflösungen unerwünschte Effekte auftreten. Abbildung 8.55 zeigt ein und denselben Dialog, einmal unter Windows und einmal unter X11 mit dem fvwm95-Window-Manager.
Technisch gesehen sind Layout-Manager Klassen, die eines der Interfaces LayoutManager oder LayoutManager2 implementieren. LayoutManager2
ist eine Erweiterung von LayoutManager, die in Version 1.1 hinzugefügt wurde, um die Realisierung komplexerer Layouts zu vereinfachen.
Die spezifische Anordung der Komponenten erfolgt über die Art der Implementierung der Methoden dieser Interfaces.
In den folgenden Abschnitten werden die Standard-Layout-Manager von Java vorgestellt. Ferner wird auf die Möglichkeiten eingegangen, eigene Layout-Manager zu definieren und Container ohne Layout-Manager zu erstellen.
Hinsichtlich der Unterstützung für Layout-Manager in Oberflächen-Generatoren sah es leider lange Zeit sehr dürftig aus. In den meisten Fällen lautete die allererste Anweisung in den erzeugten Dialogen:setLayout(null);Entsprechend wurde mit absoluten Koordinaten gearbeitet, was mit den zuvor diskutierten Schwierigkeiten verbunden ist. Lediglich das FlowLayout wurde in einigen wenigen Fällen unterstützt. Glücklicherweise hat sich die Lage bis zum heutigen Zeitpunkt gebessert. Die aktuellen Versionen heutiger Entwicklungsumgebungen unterstützen die meisten Layout-Manager der Standardbibliothek.