Was ist das Standard Widget Toolkit (SWT)?
Allgemeines
SWT ist sehr betriebssystemnah gestaltet und greift wo
möglich auf native Komponenten des Betriebssystems
unmittelbar zu. Dies ermöglicht eine sehr direkte Reaktion
auf jede Art von Änderungen des zugrunde liegenden
Betriebssystems.
Der typische Aufbau eines SWT-Programms
folgt dem nachstehenden Schema:
-
Erzeugung eines
Display
-Objektes - Dieses Objekt repräsentiert eine SWT-Session. Es ist u.a. verantwortlich für die Steuerung von Threads, das Event-Handling der Applikation und stellt die Verbindung zum zugrunde liegenden Betriebssystem dar.
-
Erzeugung eines oder mehrerer
Shell
-Objekte -
Sie stellen die Fenster des Programms dar. Bei der Erzeugung
einer Top-Level-Shell wird ein
Display
-Objekt als Parameter übergeben. - Hinzufügen und Konfigurieren von Widgets
- An dieser Stelle erfolgt die Ausarbeitung des jeweiligen Fachkonzepts.
-
Öffnen des Fensters durch
open()
. - Die Methode aktiviert die Shell, zeigt sie an und setzt den Fokus.
- Initialisieren des event dispatching loop.
- Er ist für die Kommunikation der nativen Betriebssystem-Widgets mit dem SWT-System zuständig und existiert so lange bis ein Terminierungsbefehl erfolgt, üblicherweise beim Schließen des Fensters.
-
Freigabe des
Display
-Objektes mittelsdispose()
- Displays unterliegen nicht der automatischen Speicherbereinigung und müssen manuell freigegeben werden. Mehr hierzu weiter unten.
Die main()
-Methode eines SWT-Programms entspricht
somit dem folgenden Muster:
public static void main (String [] args) { Display display = new Display (); Shell shell = new Shell (display); // widgets erstellen shell.open (); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); }
Widgets
Widgets sind grafische Elemente, die der Interaktion mit dem
User während des Lebenszyklus des Programms dienen
(Buttons, Tabellen, Textfelder, etc.). Alle Widgets, die keine
Top-Level-Shells sind, müssen ein Elternelement, ('parent'),
besitzen, sodass man sich eine Shell
wie einen
Widget-Baum vorstellen kann, bei dem übergeordnete Widgets
die Elternelemente der untergeordneten sind.
Jedoch nicht
alle Widgets können andere Widgets enthalten. Widgets, die
andere enthalten können, werden als Composite
bezeichnet und sind von der Klasse org.eclipse.swt.widgets.Composite
abgeleitet.
Die Konfiguration von Widgets erfolgt oft durch sog. stylebits,
die dem Konstruktor bei der Erzeugung des Widgets als Parameter
übergeben werden. Hierbei handelt es sich um Konstanten (public
final static
deklarierte int
-Felder),
die vergeben werden, wenn eine Eigenschaft eines Widgets nicht
zu Laufzeit geändert werden muss oder darf. Die
Konfigurationsmöglichkeiten von stylebits sind überaus
vielfältig und reichen von der Definition grundlegender
Funktionen bis zu Eigenschaften des Look and Feels.
Die
Konstanten sind in der Klasse org.eclipse.swt.SWT
definiert und können in den Javadocs nachgeschlagen werden.
Mehrere für ein Widget gültige stylebits können
durch eine Pipe ('|
') miteinander kombiniert
werden.
Button button = new Button(shell, SWT.PUSH | SWT.FLAT);
Speicher-Management
Die Nähe des SWT zum zugrunde liegenden Betriebssystem
bringt es mit sich, dass in einigen Fällen Ressourcen des
Betriebssystems alloziert werden, die nicht durch den Java
Garbage Collector wieder freigegeben werden können. Dies
muss in diesen Fällen durch den Aufruf von dispose()
manuell erfolgen. Im Allgemeinen kann hierbei nach den folgenden
Regeln vorgegangen werden:
- Objekte vom Typ
Color, Cursor, Display, Font, GC, Image, Printer, Region
undWidget
müssen explizit freigegeben werden, wenn sie mittels Konstruktor gebildet wurden. Für entsprechende Objekte, die auf andere Weise ermittelt werden (z.B. durch Getter-Methoden), gilt die Freigabenotwendigkeit nicht, da hierbei keine Ressourcen alloziert wurden. - Beim Freigeben eines
Composit
werden seine Kindelemente rekursiv mit freigegeben, nicht jedoch Graphik-Elemente wie z.B.Font
- oderColor
-Objekte, die mit dem Widget verbunden sind. Die Ursache ist darin zu suchen, dass im Gegensatz etwa zu Widgets, diese Elemente keine wirklichen Kindelemente darstellen und möglicherweise an anderer Stelle weiterhin Verwendung finden könnten.
Wird die Speicherfreigabe nicht sachgemäß durchgeführt, kann es zu Speicherleaks kommen, die zu einer allmählichen Überlastung des Rechners führen. Zur Ermittlung eventueller Speicherleaks kann das kleine Tool Sleak verwendet werden, dessen Anwendung unter https://www.eclipse.org/articles/swt-design-2/sleak.htm erläutert wird.
Quellen
https://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fswt.htm
https://www.eclipse.org/articles/swt-design-2/swt-design-2.html
https://www.vogella.com/tutorials/SWT/article.html
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.