SWT enthält viele leistungsstarke Funktionen. Trotzdem müssen Sie lediglich Basiskenntnisse über den Kern des Systems - Fensterobjekte, Layouts und Ereignisse - besitzen, um nützliche und robuste Anwendungen implementieren zu können.
Wenn Sie Benutzerschnittstellenelemente über Workbench-Erweiterungen der Plattform ergänzen, wird das Starten von SWT von der Workbench für Sie übernommen.
Wenn Sie eine SWT-Anwendung vollig neu (außerhalb der Workbench) schreiben, müssen Sie mehr über die Anwendungsstruktur von SWT wissen.
Eine typische SWT-Standalone-Anwendung hat die folgende Struktur:
Erstellung einer Klasse Display, die eine SWT-Sitzung darstellt.
Erstellung von einem oder mehreren Objekten Shell, die als Hauptfenster der Anwendung dienen.
Erstellung aller anderen Fensterobjekte, die in der Shell benötigt werden.
Initialisierung der Größen und anderer erforderlicher Statuswerte für die Fensterobjekte. Registrierung von Listener-Funktionen für Fensterobjektereignisse, die verarbeitet werden müssen.
Öffnen des Shell-Fensters.
Ausführen der Schleife für die Ereigniszuteilung, bis eine Exit-Bedingung auftritt (normalerweise dann, wenn der Benutzer das Hauptfenster der Shell schließt).
Freigeben der Anzeige.
Der folgende Code-Ausschnitt ist aus der Anwendung org.eclipse.swt.examples.helloworld.HelloWorld2 übernommen. Da die Anwendung lediglich die Zeichenfolge "Hello World" ausgibt, müssen keine Fensterobjektereignisse für sie registriert werden.
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
label.setText ("Hello_world");
label.setBounds (shell.getClientArea ());
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
Die Anzeige (Klasse "Display") stellt die Verbindung zwischen SWT und dem GUI-System der zu Grunde liegenden Plattform dar. Anzeigen werden primär dazu verwendet, die Ereignisschleife der Plattform zu verwalten und die Kommunikation zwischen dem UI-Thread und anderen Threads zu steuern. (Eine umfassende Erörterung der UI-Thread-Aspekte finden Sie unter Hinweise zur Verwendung von Threads für Clients.)
Bei den meisten Anwendungen können Sie nach dem oben dargestellten Muster vorgehen. Sie müssen eine Anzeige erstellen, bevor Sie Fenster erstellen können, und Sie müssen die Anzeige freigeben, wenn die Shell geschlossen wird. Weitere Gedanken zur Anzeige müssen Sie sich nur dann machen, wenn Sie eine Anwendung mit mehreren Threads entwerfen.
Eine Shell ist ein Fenster, das durch den Fenstermanager der Betriebssystemplattform verwaltet wird. Shells der höchsten Ebene werden als Kind der Anzeige erstellt. Diese Fenster kann der Benutzer bei der Verwendung der Anwendung verschieben, auf Symbolgröße setzen, als Vollbild anzeigen oder in der Größe verändern. Sekundäre Shells sind die Shells, die als Kind einer anderen Shell erstellt werden. Diese Fenster werden normalerweise als Dialogfenster oder andere vorübergehend angezeigte Fenster verwendet, die nur im Kontext eines anderen Fensters vorhanden sind.
Alle Fensterobjekte, bei denen es sich nicht um Shells der höchsten Ebene handelt, haben Eltern. Shells der höchsten Ebene haben kein Elter, werden aber alle mit der Zuordnung zu einer bestimmten Anzeige erstellt. Auf diese Anzeige können Sie mit der Methode getDisplay() zugreifen. Alle anderen Fensterobjekte werden als (direkte oder indirekte) Nachfahren der Shells der höchsten Ebene erstellt.
Kombinierte Anzeigenobjekte (Composite) sind Fensterobjekte, die Kinder haben können.
Ein Anwendungsfenster kann als Baumstruktur oder Hierarchie der Fensterobjekte betrachtet werden, deren Ausgangsebene die Shell ist. Abhängig von der Komplexität der Anwendung kann die Shell lediglich ein einziges Kindelement, mehrere Kinder oder verschachtelte Ebenen von kombinierten Anzeigenobjekten mit Kindern haben.
Wenn Ihre Anwendung ein Fensterobjekt erstellt, erstellt SWT sofort das Fensterobjekt der zu Grunde liegenden Plattform. Auf diese Weise wird kein Code benötigt, der je nach Vorhandensein des Fensterobjekts im zu Grunde liegenden Betriebssystem anders ausgeführt wird. Außerdem kann hierdurch die Mehrheit der Fensterobjektdaten auf Plattformebene aufbewahrt werden und muss nicht im Toolkit repliziert werden. Dies bedeutet, dass das Konzept für den Lebenszyklus eines Fensterobjekts, das von einem Toolkit verwendet wird, mit den Regeln des zu Grunde liegenden GUI-Systems übereinstimmen muss.
Bei den meisten GUI-Plattformen müssen Sie bei der Erstellung eines Fensterobjekts ein Elter angeben. Da SWT ein Fensterobjekt der Plattform erstellt, sobald Sie ein Fensterobjekt im Toolkit erstellen, muss das Elternfensterobjekt im Konstruktor für das Fensterobjekt angegeben werden.
Einige Eigenschaften für ein Fensterobjekt müssen bereits bei seiner Erstellung durch das Betriebssystem festgelegt werden und können später nicht mehr geändert werden. Beispielsweise muss für eine Liste Einzel- oder Mehrfachauswahl angegeben werden. Außerdem muss definiert werden, ob sie Schiebeleisten enthält oder nicht.
Diese Eigenschaften, die als Darstellung bezeichnet werden, müssen im Konstruktor festgelegt sein. Alle Konstruktoren für Fensterobjekte übernehmen ein Argument int, das die gewünschten Darstellungen durch OR bitweise angibt. In einigen Fällen wird eine bestimmte Darstellung als eine Art "Hinweis" betrachtet. Dies bedeutet, dass sie möglicherweise nicht auf allen Plattformen zur Verfügung steht, jedoch problemlos auf den Plattformen ignoriert werden kann, die sie nicht unterstützen.
Die Darstellungskonstanten befinden sich in Form von öffentlichen statischen Feldern in der Klasse SWT. Eine Liste der Konstanten, die auf die einzelnen Fensterobjektklassen angewendet werden können, finden Sie in der API-Referenz für SWT.
Die Betriebssystemplattformen unterhalb von SWT erfordern eine explizite Zuordnung und Freigabe von Betriebssystemressourcen. Um die Philosophie des SWT-Designs zu respektieren, die die Wiedergabe der Plattformanwendungsstruktur im Toolkit für Fensterobjekte anstrebt, müssen Sie in SWT alle zugeordneten Betriebssystemressourcen explizit freigeben. In SWT werden Ressourcen, die einem bestimmten Toolkit-Objekt zugeordnet sind, mit der Methode dispose() freigegeben.
In diesem Zusammenhang gilt die folgende Faustregel: Wenn Sie selbst ein Objekt erstellen, müssen Sie es auch freigeben. Die folgenden Grundregeln erläutern diese Philosophie genauer:
Wenn Sie ein Fensterobjekt oder ein Grafikobjekt unter Verwendung eines Konstruktors erstellen, müssen Sie es nach seiner Verwendung manuell freigeben.
Wenn Sie ein Fensterobjekt oder ein Grafikobjekt ohne Verwendung eines Konstruktors abrufen, müssen Sie es nicht manuell freigeben, weil Sie es nicht selbst zugeordnet haben.
Wenn Sie an Ihr Fensterobjekt oder Grafikobjekt einen Verweis auf ein anderes Objekt übergeben, müssen Sie darauf achten, dass es nicht freigegeben wird, solange es verwendet wird. (Die Anwendung dieser Regel in der Praxis wurde unter Plug-in-Muster für die Verwendung von Images bereits vorgestellt.)
Wenn der Benutzer eine Shell schließt, werden die Shell und alle ihr untergeordneten Fensterobjekte rekursiv freigegeben. In diesem Fall müssen Sie nicht selbst für das Freigeben der Fensterobjekte sorgen. Sie müssen jedoch alle Grafikressourcen freigeben, die in Zusammenhang mit diesen Fensterobjekten zugeordnet wurden.
Wenn Sie ein Grafikobjekt erstellen, das Sie während der gesamten Lebensdauer eines Ihrer Fensterobjekte verwenden wollen, müssen Sie das Grafikobjekt freigeben, nachdem das Fensterobjekt freigegeben wurde. Hierzu registrieren Sie eine Listener-Funktion für das Freigeben des Fensterobjekts und geben das Grafikobjekt frei, sobald das Ereignis für das Freigeben empfangen wurde.
Für diese Regeln gibt es eine Ausnahme. Einfache Datenobjekte wie Rectangle und Point verwenden keine Betriebssystemressourcen. Sie verfügen nicht über eine Methode dispose() und müssen von Ihnen nicht freigegeben werden. In Zweifelsfällen lesen Sie die Javadoc-Datei zur jeweiligen Klasse.