Eclipse RCP
20.09.2010 - 24.09.2010, Hamburg
git
07.10.2010 - 08.10.2010, Essen
Eclipse RCP

Einführung SWT: Standard Widget Toolkit

Grundlegender Aufbau von SWT

Das Standard Widget Toolkit (SWT) ist das GUI-Framework der Eclipse-Plattform. Es stellt ein Java API bereit, um mit den nativen UI-Widgets des Betriebssystems zu arbeiten. Folgende Plattformen werden unterstützt:

Durch die Nutzung der Betriebssystem-Widgets wird auf allen unterstützten Plattformen ein natives Look&Feel erreicht:

SWT bildet meist nur den kleinsten gemeinsamen Nenner der unterstützten Plattformen ab, lediglich in wenigen Fällen wird fehlende Betriebssystemfunktionalität emuliert. Über die Widget-Funktionalität hinausgehende Abstraktionen werden aufbauend auf SWT von der Komponente JFace bereitgestellt.

Komponentenstruktur

Intern ist das Java API durch native JNI-Aufrufe implementiert, d.h. SWT benötigt für jede Zielplattform native Bibliotheken. In Eclipse sind diese in den SWT-Plugins für die jeweilige Plattform enthalten:

SWT Plug-in

SWT-Klassenhierarchie

Alle Standard-SWT-Widgets befinden sich im Package org.eclipse.swt.widgets und sind von den Basisklassen Widget, Control, Scrollable und Composite abgeleitet:

Erzeugen von Widgets

Widgets werden über den Konstruktor der Klasse erzeugt. Dabei sind das Eltern-Composite sowie ein Style-Flag anzugeben:

Button myButton = new Button(parentComposite, SWT.PUSH | SWT.RIGHT);
myButton.setText("Hello world!");

Von den Widgets der obersten Ebene wie Shell (Fenster) abgesehen haben alle Widgets ein Eltern-Element. Dieses wird das neu erzeugte Widget beherbergen.

Über die Style-Flags kann das Aussehen und Verhalten des Widgets beeinflusst werden. Es handelt sich dabei um Bitkonstanten, die in der Klasse org.eclipse.swt.SWT definiert sind. Die erlaubten Styles sind im JavaDoc der Widget-Klasse dokumentiert. Mehrere Style-Flags werden mit binärem Oder verknüpft. Möchte man keine Style-Flags angeben, verwendet man SWT.NONE.

Widget-Übersicht und SWT Snippets

Eine Übersicht aller SWT Widgets mit JavaDocs und Beispiel-Snippets finden Sie unter SWT Widgets sowie in Anhang 1.

Die Beispiel-Snippet-Quelltexte können über die Zwischenablage direkt in Eclipse-Projekte eingefügt werden:

Snippets einfügen

Tips & Tricks: Packages ignorieren

Wenn Sie ausschließlich mit SWT arbeiten, stören bei der Vervollständigung von Namen im Editor gleichnamige Klassen aus anderen Packages wie z.B. java.awt:

Sie können diese Packages ausblenden, indem Sie sie in den Eclipse-Einstellungen einen “Type Filter” konfigurieren:

Control API

Jedem SWT Control können Sie Position und Größe zuweisen:

control.setLocation(new Point(x, y));
control.setSize(new Point(x, y));
control.setBounds(new Rectangle(x, y, width, height));

Es deaktivieren oder ausblenden:

control.setEnabled(false);
control.setVisible(false);

Den Fokus zuweisen:

control.setFocus();

Ereignisbehandlung

Sobald ein Ereignis auftritt, werden alle beim jeweiligen SWT Control registrierten Listener darüber benachrichtigt. Um einem Control einen Listener hinzuzufügen, verwendet man die add...Listener-Methoden des Controls. Je nach Control stehen verschiedene Listener-Methoden zur Verfügung, z.B.:

button.addSelectionListener(selectionListener);
button.addFocusListener(focusListener);

Die Listener-Klasse kann als anonyme innere Klasse angelegt werden, z.B.:

btn.addSelectionListener(new SelectionListener() {

    public void widgetSelected(SelectionEvent e) {
        // Handle Button selection event here
    }

    public void widgetDefaultSelected(SelectionEvent e) {
        // Handle Button default selection event here
    }
    
});

Dazu gibt es einen praktischen Eclipse-Shortcut: Wenn der Cursor zwischen den Klammern des Listener-Konstruktors steht, können Sie die Vervollständigung per Ctrl+Space verwenden, um die Klasse automatisch zu erzeugen:

Da für Interfaces immer sämtliche Methoden implementiert werden müssen, existiert zu den meisten Interfaces wie SelectionListener eine abstrakte Klasse SelectionAdapter, bei der nur die tatsächlich benötigten Methoden implementiert werden müssen:

Event Adapter-Klassen

btn.addSelectionListener(new SelectionAdapter() {

    public void widgetSelected(SelectionEvent e) {
        // Handle Button selection event here
    }

});
Über Ihre Kommentare und Hinweise freue ich mich sehr:
Ralf Ebert | Eclipse RCP Buch | Einführung SWT: Standard Widget Toolkit