Es kann vorkommen, dass keines der in SWT bereitgestellten Steuerelemente die Anforderungen Ihrer Anwendung erfüllt. In solchen Fällen können Sie SWT erweitern, indem Sie ein eigenes, angepasstes Fensterobjekt implementieren. SWT selbst stellt ein Paket namens org.eclipse.swt.custom für angepasste Steuerelemente zur Verfügung, die nicht zur Kerngruppe der SWT-Steuerelemente gehören, aber zur Implementierung der Plattform-Workbench benötigt werden.
Steuerelement
|
Zweck
|
Darstellungen
|
Ereignisse |
---|---|---|---|
Ähnelt dem Steuerelement "Combo", kann jedoch angepasst gezeichnet werden, um ein Steuerelement "Combo" ohne Rahmen zu verwenden. Diese Klasse wurde für die Verwendung von kombinierten Feldern in Tabellenzellen entwickelt. |
BORDER, FLAT, READ_ONLY |
Dispose, Control*, Selection | |
Ähnelt dem Steuerelement "Label", unterstützt jedoch das Abschneiden von Text mit Auslassungen. Unterstützt außerdem einen Verlaufseffekt für die Hintergrundfarbe (wird beispielsweise in der aktiven Workbench-Sicht verwendet). Umbruch wird nicht unterstützt. |
CENTER, LEFT, RIGHT, SHADOW_IN, SHADOW_OUT, SHADOW_NONE |
Dispose, Control* | |
Ähnelt dem Steuerelement "TabFolder", unterstützt jedoch eine zusätzliche Konfiguration der optischen Darstellung von Registerkarten (oben oder unten) und Rahmen. |
BORDER, FLAT, BOTTOM, TOP |
Dispose, Control*, Selection | |
Ein auswählbares Benutzerschnittstellenobjekt, das einer Registerkarte für eine Seite in einem Ordner mit Registerkarten (CTabFolder) entspricht. |
|
Dispose, Control* | |
Ein zusammengesetztes Steuerelement, das seine untergeordneten Objekte in Zeilen- oder Spaltenanordnung darstellt und sie durch ein Größensteuerfeld trennt, dessen Größe der Benutzer ändern kann. |
BORDER, HORIZONTAL, VERTICAL |
Dispose, Control* | |
Ein zusammengesetztes Steuerelement, das seinen Inhalt verschiebt und optional vergrößert und dann den verfügbaren Platz ausfüllt. |
BORDER, H_SCROLL, V_SCROLL |
Dispose, Control* | |
Ein Steuerelement, das der Benutzer durch die Eingabe von Text bearbeiten kann. Textbereiche innerhalb des Steuerelements können unterschiedliche Farben (Vordergrund und Hintergrund) und Schriftarten (fett und normal) annehmen. |
BORDER, FULL_SELECTION, MULTI, SINGLE, WRAP, READ_ONLY |
Dispose, Control*, ExtendedModify, LineGetBackground, LineGetSegments, LineGetStyle, Modify, Selection, Verify, VerifyKey | |
Ein auswählbares Steuerelement, das eine hierarchische Liste von Elementen anzeigt, die durch den Benutzer ausgewählt werden können. Die Einträge werden in Zeilen dargestellt, in denen mehrere Spalten die einzelnen Aspekte der Einträge darstellen. |
BORDER, SINGLE, MULTI, CHECK, FULL_SELECTION |
Dispose, Control*, Selection, DefaultSelection, Collapse, Expand | |
Ein auswählbares Benutzerschnittstellenobjekt, das eine Hierarchie von Elementen in einer Tabellenbaumstruktur (TableTree) darstellt. |
|
||
Ein zusammengesetztes Steuerelement, das seine untergeordneten Objekte horizontal anordnet und dessen Layout- und Rahmenparameter programmatische gesteuert werden können. Wird in der Workbench verwendet, um die Bezeichnung, Symbolleiste und lokale Menüleiste einer Sicht zu implementieren. |
BORDER, FLAT |
Dispose, Control* |
Control* = Aus einem Ereignis Control übernommene Ereignisse: FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize
Bevor Sie ein angepasstes Fensterobjekt implementieren, sollten Sie die folgenden wichtigen Aspekte überdenken:
Wenn Sie feststellen, dass Sie ein angepasstes Fensterobjekt benötigen, und festgelegt haben, welche Plattformen unterstützt werden müssen, können Sie unterschiedliche Implementierungstechniken für das Fensterobjekt verwenden. Diese Techniken können Sie mischen und darauf abstimmen, welche Elemente in der zu Grunde liegenden Betriebssystemplattform verfügbar sind.
Wenn Ihre Anwendung ein natives Fensterobjekt benötigt, das durch SWT nicht zur Verfügung gestellt wird, müssen Sie es auf nativem Weg erstellen. Dies kann ein Plattformfensterobjekt, ein Fensterobjekt eines Drittherstellers oder ein beliebiges anderes Fensterobjekt in einer gemeinsam benutzten Bibliothek der Plattform sein.
Jede SWT-Plattform wird sowohl mit einer gemeinsam benutzten Bibliothek (z. B. eine DLL unter Windows) und einer JAR (für die Java-Klassendateien) ausgeliefert. Die gemeinsam benutzte Bibliothek enthält alle für SWT erforderlichen nativen Funktionen, ist jedoch nicht als komplette Sammlung der Funktionen zu verstehen, die auf der Plattform verfügbar sind. Um eine native Funktion oder native Fensterobjekte bereitzustellen, die durch SWT nicht zur Verfügung gestellt werden, müssen Sie eine eigene gemeinsam benutzte Bibliothek schreiben. Wenn Sie eine Kombination aus nativem Code auf einer Plattform und portierbarem Code auf einer anderen Plattform verwenden, müssen Sie darauf achten, auf der Plattform mit dem nativen Fensterobjekt Ihre gemeinsam benutzte Bibliothek und auf der Plattform mit dem portierbaren Fensterobjekt die JAR aufzurufen.
Um ein natives Fensterobjekt implementieren zu können, müssen Sie Kenntnisse über JNI (Java Native Interface - Java-native Schnittstelle), die API des Fensterobjekts in der gemeinsam benutzten Bibliothek und die APIs in C der zu Grunde liegenden Betriebssystemplattform besitzen.
Der Basisprozess zur Implementierung besteht daraus, dass Sie festlegen, welcher Teil der API des nativen Fensterobjekts in der Java-API bereitgestellt wird, und den Java-Code schreiben, der die nativen Elemente aufruft, um das Verhalten zu implementieren. Der Aufruf der gemeinsam benutzten Bibliothek muss in JNI C-Code geschrieben werden.
Bei der Erstellung einer Implementierung für ein eigenes natives Fensterobjekt hat es sich bewährt, die Entwurfsrichtlinien zu befolgen, die für die Implementierung von SWT gelten. Ihre nativen JNI-Elemente sollten beispielsweise den API-Aufrufen, die in der gemeinsam benutzten Bibliothek erfolgen, im Eins-zu-Eins-Verhältnis zugeordnet werden.
Ein vollständiges Beispiel für die Implementierung eines nativen angepassten Fensterobjekts finden Sie unter Creating Your Own Widgets using SWT..
Wenn Ihr neues Fensterobjekt einem vorhandenen Fensterobjekt hinsichtlich Konzept oder Implementierung ähnelt, ist es unter Umständen sinnvoll, ein vorhandenes SWT-Fensterobjekt zu erweitern. Diese Technik wird bei der Implementierung des Elements TableTree angewendet.
Um ein Fensterobjekt zu erweitern, erstellen Sie eine Unterklasse des Fensterobjekts Composite oder Canvas (dies ist davon abhängig, ob Ihr Steuerelement untergeordneten Elemente enthalten soll). Das erweiterte Fensterobjekt erstellen Sie im Konstruktor für das angepasste Fensterobjekt. Das resultierende Fensterobjekt ist vollständig auf Java portierbar, da Sie die API des erweiterten Fensterobjekts bei der Implementierung aufrufen.
Die Erweiterung eines Fensterobjekts zum Implementieren von angepassten Fensterobjekts ist häufig einfacher, als die Erstellung solcher Objekte völlig neu zu beginnen. Beim Entwurf der API für das neue Fensterobjekt müssen Sie jedoch äußerst sorgfältig vorgehen und auf die folgenden wichtigen Punkte achten:
Überlegen Sie sich, ob Ihr Fensterobjekt "eine Art" erweitertes Fensterobjekt ist oder ob es lediglich ein vorhandenes Objekt zu seiner Implementierung verwendet. Eine Tabellenbaumstruktur ist beispielsweise keine Art Tabelle. Sie bezieht sich nicht durch einen Index mit Zeilennummern auf die Einträge. Das Fensterobjekt TableTree verwendet lediglich eine Tabelle, um die Darstellung zu implementieren, und fügt dann das Verhalten einer Baumstruktur hinzu. Wenn Sie ein Fensterobjekt lediglich aus Implementierungsgründen erweitern, hat seine API möglicherweise keine Ähnlichkeit mit der API des zu Grunde liegenden Fensterobjekts.
Leiten Sie so wenige Methoden und Ereignisse wie möglich weiter. Implementieren Sie nicht die gesamte API des erweiterten Fensterobjekts erneut, da Sie in diesem Fall ständig Angleichungen vornehmen müssen, wenn die erweiterte API in späteren Freigaben geändert wird. Methoden, die von vielen Fensterobjekten verwendet werden (z. B. setFont, setForeground, setBackground), sollten weitergeleitet werden.
Wenn Sie feststellen, dass Sie den Großteil der API des erweiterten Fensterobjekts implementieren, sollten Sie das erweiterte Fensterobjekt unter Umständen auf API-Ebene zur Verfügung stellen und direkt durch den Anwendungscode verwenden lassen. In diesem Fall sollten Sie eventuell auch noch einmal prüfen, ob die Erstellung eines neuen Fensterobjekts überhaupt sinnvoll ist. Möglicherweise ist es einfacher, Ihre Funktion als "Adapter" zu implementieren, der Verhalten zu einem Fensterobjekt hinzufügt, aber selbst kein Fensterobjekt ist. (Dieses Muster wird beispielsweise bei JFace-Anzeigefunktionen verwendet.)
Hinweis: Diese Erläuterung bezieht sich lediglich auf die Erweiterung des Verhaltens eines Fensterobjekts. Von der Erweiterung eines Fensterobjekts durch die Aufnahme als Unterklasse wird dringend abgeraten, da Ihr Fensterobjekt auf diese Weise von der Implementierung der Superklasse abhängig wird.
In manchen Fällen sind weder nativer Code noch Fensterobjekte vorhanden, die Sie bei der Implementierung des neuen Fensterobjekts nutzen könnten. Dies hat zur Folge, dass Sie das Fensterobjekt selbst über SWT-Grafikaufrufe zeichnen müssen. Obwohl diese Methode recht kompliziert sein kann, hat sie den Vorteil, eine vollständig portierbare Implementierung zu erzeugen.
Angepasste gezeichnete Steuerelemente werden durch die Aufnahme der Klasse Canvas oder Composite als Unterklasse implementiert, wobei die folgenden Regeln gelten:
In einem angepassten gezeichneten Steuerelement wird der interne Status in Form von Java-Exemplarvariablen erhalten. Sie definieren die API und Darstellungen gemäß den Anforderungen des Fensterobjekts.
Die interne Implementierung eines angepassten gezeichneten Fensterobjekts umfasst normalerweise die folgenden Haupttasks:
Viele Fensterobjekte, die in org.eclipse.swt.custom implementiert sind, verwenden diese Methode. Ein einfaches Beispiel finden Sie unter CLabel.
Weitere Informationen zu angepassten Fensterobjekten finden Sie unter Creating your own widgets with SWT.