SWT Layout-Manager
Elemente gruppieren mit Composite und Group
Die Klasse Composite können Sie verwenden, um Steuerelemente in einem Container zu gruppieren. Möchten Sie zusätzlich einen sichtbaren Rahmen und eine Beschriftung um die enthaltenen Elemente, können Sie Group verwenden:
Composite composite = new Composite(parent, SWT.NONE);
Label label1_1 = new Label(composite, SWT.NONE);
label1_1.setText("Label1");
Label label1_2 = new Label(composite, SWT.NONE);
label1_2.setText("Label2");
Group group = new Group(parent, SWT.NONE);
group.setText("Group2 Text");
Label label2_1 = new Label(group, SWT.NONE);
label2_1.setText("Label1");
Label label2_2 = new Label(group, SWT.NONE);
label2_2.setText("Label2");
Layout-Manager
SWT kümmert sich zunächst nicht um die Position und Größe von Widgets. Da die Standardgröße für Controls (0, 0) ist, werden Controls erst dann sichtbar, wenn sie mit setBounds positioniert werden. Diese Aufgabe sollte man einem Layout-Manager überlassen, der die Positionierung der Controls anhand vorgegebener Bedingungen übernimmt. Dazu setzt man auf dem umgebenden Composite ein Layout-Objekt:
composite.setLayout(layout);
SWT stellt eine Reihe von Layout-Managern bereit, die verschiedene Ausrichtungsstrategien implementieren:
Zu fast allen Layouts gehört eine LayoutData-Klasse:
Ein solches LayoutData-Objekt kann Controls gesetzt werden, um festzulegen, wie dieses einzelne Control auszurichten ist:
control.setLayoutData(layoutData);
Beispiel: Einem Label in einem Composite mit RowLayout kann ein RowData-Objekt gesetzt werden, z.B. um eine abweichende Größe für dieses Label festzulegen:
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new RowLayout());
Label label = new Label(composite, SWT.NONE);
label.setLayoutData(new RowData(100, SWT.DEFAULT));
API FillLayout
Das FillLayout verteilt sämtlichen zur Verfügung stehenden Platz gleichmäßig. Dabei können folgende Optionen gesetzt werden:
API RowLayout
RowLayout richtet alle Controls zeilen- oder spaltenweise aus und bricht ggf. um:
API GridLayout
GridLayout positioniert alle Controls von links-nach-rechts, oben-nach-unten in einer tabellarischen Anordnung. Mit folgenden Optionen können Sie das Layout steuern:
Das Layout für eine einzelne Tabellenzelle können Sie über das GridData-Objekt beeinflussen:
Tipp: Um GridLayout und GridData-Objekte erzeugen, können die JFace-Klassen GridLayoutFactory und GridDataFactory verwendet werden. Diese stellen ein API bereit, mit dem Sie diese Objekte mit Einzeilern erzeugen und an Controls zuweisen können:
GridLayoutFactory.swtDefaults().numColumns(3).margins(10, 5).applyTo(someComposite);
API FormLayout
FormLayout richtet Controls relativ zu den Kanten anderer Controls oder zu den Kanten des beinhaltenden Composite aus:
Sie können die Kanten eines Controls fixieren, indem Sie dem FormData für left, top, right oder bottom ein FormAttachment setzen. Alle verbleibenden Kanten werden automatisch berechnet. Die einfachste Möglichkeit ist die prozentuale Positionierung relativ zu den Kanten des umgebenden Composite:
FormData formData = new FormData();
// Linke Kante von control auf 25% der Gesamtbreite + 10px Offset fixieren
formData.left = new FormAttachment(25, 10);
// Untere Kante von control auf 75% der Gesamthöhe fixieren
formData.bottom = new FormAttachment(75);
control.setLayoutData(formData);
Alternativ können Sie mit dem Konstruktor new FormAttachment(control, offset, alignment) eine Kante relativ zu einer Kante eines anderen Controls fixieren:
FormData formData = new FormData();
formData.left = new FormAttachment(otherControl, 10, SWT.RIGHT);
formData.bottom = new FormAttachment(otherControl, 0, SWT.BOTTOM);
control.setLayoutData(formData);
Hier wird die linke Kante mit 10 Pixel Abstand relativ zur rechten Kante von otherControl fixiert. Die untere Kante wird ohne Abstand direkt auf die untere Kante von otherControl gelegt:
Offset und Ausrichtung sind dabei optional. Wird keine Ausrichtung angegeben, wird an der entgegengesetzten Kante ausgerichtet (wenn Sie z.B. die linke Kante fixieren, wird diese an der rechten Kante des anderen Controls ausgerichtet).



Hallo Herr Ebert,
ich bin in der Java-Entwicklung nicht sehr fortgeschritten (Selbststudium) und speziell in SWT noch ganz am Anfang. Ich habe mir daher speziell die Kapitel über die Layoutmanager angesehen.
Die Gestaltung ist sehr angenehm und der Stil gut verständlich und lesbar. Für mich als Anfänger hätten gern noch mehr Details dabei stehen können, aber das Grundprinzip wird klar und eine Referenz der vorhandenen Möglichkeiten finde ich auch in der JavaDoc.
Vielen Dank für diese Informationen!
Jorgos Kyriazis