Angepasste Fensterobjekte

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 Widget 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

CCombo

Ä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

CLabel

Ä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*

CTabFolder

Ä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

CTabItem

Ein auswählbares Benutzerschnittstellenobjekt, das einer Registerkarte für eine Seite in einem Ordner mit Registerkarten (CTabFolder) entspricht.

 
Dispose, Control*

SashForm

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*

ScrolledComposite

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*

StyledText

Ein Steuerelement, das der Benutzer durch die Eingabe von Text bearbeiten kann. Textbereiche innerhalb des Steuerelements können unterschiedliche Schriftarten und Farben (Vordergrund und Hintergrund) annehmen.

BORDER, FULL_SELECTION, MULTI, SINGLE, WRAP, READ_ONLY

Dispose, Control*, ExtendedModify, LineGetBackground, LineGetSegments, LineGetStyle, Modify, Selection, Verify, VerifyKey

TableTree

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

TableTreeItem

Ein auswählbares Benutzerschnittstellenobjekt, das eine Hierarchie von Elementen in einer Tabellenbaumstruktur (TableTree) darstellt.

 
 

ViewForm

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 Widget implementieren, sollten Sie die folgenden wichtigen Aspekte überdenken:

Wenn Sie feststellen, dass Sie ein angepasstes Widget benötigen, und festgelegt haben, welche Plattformen unterstützt werden müssen, können Sie unterschiedliche Implementierungstechniken für das Widget verwenden. Diese Techniken können Sie mischen und darauf abstimmen, welche Elemente in der zu Grunde liegenden Betriebssystemplattform verfügbar sind.

Native Implementierung

Wenn Ihre Anwendung ein natives Widget benötigt, das durch SWT nicht zur Verfügung gestellt wird, müssen Sie es auf nativem Weg erstellen. Dies kann ein Plattform-Widget, ein Widget eines Drittherstellers oder ein beliebiges anderes Widget 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 Widgets 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 Widget Ihre gemeinsam benutzte Bibliothek und auf der Plattform mit dem portierbaren Widget die JAR aufzurufen.

Um ein natives Widget implementieren zu können, müssen Sie Kenntnisse über JNI (Java Native Interface - Java-native Schnittstelle), die API des Widgets 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 Widgets 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 Widget 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 Widgets finden Sie unter Creating Your Own Widgets using SWT..

Vorhandenes Widget erweitern

Wenn Ihr neues Widget einem vorhandenen Widget hinsichtlich Konzept oder Implementierung ähnelt, ist es unter Umständen sinnvoll, ein vorhandenes SWT-Widget zu erweitern. Diese Technik wird bei der Implementierung des Elements TableTree angewendet.

Um ein Widget zu erweitern, erstellen Sie eine Unterklasse des Widgets Composite oder Canvas (dies ist davon abhängig, ob Ihr Steuerelement untergeordneten Elemente enthalten soll). Das erweiterte Widget erstellen Sie im Konstruktor für das angepasste Widget. Das resultierende Widget ist vollständig auf Java portierbar, da Sie die API des erweiterten Widgets bei der Implementierung aufrufen.

Die Erweiterung eines Widgets zum Implementieren von angepassten Widgets ist häufig einfacher, als die Erstellung solcher Objekte völlig neu zu beginnen. Beim Entwurf der API für das neue Widget müssen Sie jedoch äußerst sorgfältig vorgehen und auf die folgenden wichtigen Punkte achten:

Überlegen Sie sich, ob Ihr Widget "eine Art" erweitertes Widget 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 Widget TableTree verwendet lediglich eine Tabelle, um die Darstellung zu implementieren, und fügt dann das Verhalten einer Baumstruktur hinzu. Wenn Sie ein Widget lediglich aus Implementierungsgründen erweitern, hat seine API möglicherweise keine Ähnlichkeit mit der API des zu Grunde liegenden Widgets.

Leiten Sie so wenige Methoden und Ereignisse wie möglich weiter. Implementieren Sie nicht die gesamte API des erweiterten Widgets 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 Widgets verwendet werden (z. B. setFont, setForeground, setBackground), sollten weitergeleitet werden.

Wenn Sie feststellen, dass Sie den Großteil der API des erweiterten Widgets implementieren, sollten Sie das erweiterte Widget 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 Widgets überhaupt sinnvoll ist. Möglicherweise ist es einfacher, Ihre Funktion als "Adapter" zu implementieren, der Verhalten zu einem Widget hinzufügt, aber selbst kein Widget ist. (Dieses Muster wird beispielsweise bei JFace-Anzeigefunktionen verwendet.)

Hinweis:  Diese Erläuterung bezieht sich lediglich auf die Erweiterung des Verhaltens eines Widgets. Von der Erweiterung eines Widgets durch die Aufnahme als Unterklasse wird dringend abgeraten, da Ihr Widget auf diese Weise von der Implementierung der Superklasse abhängig wird.

Angepasste Zeichnungselemente implementieren

In manchen Fällen sind weder nativer Code noch Widgets vorhanden, die Sie bei der Implementierung des neuen Widgets nutzen könnten. Dies hat zur Folge, dass Sie das Widget 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 Widgets.

Die interne Implementierung eines angepassten gezeichneten Widgets umfasst normalerweise die folgenden Haupttasks:

Viele Widgets, die in org.eclipse.swt.custom implementiert sind, verwenden diese Methode. Ein einfaches Beispiel finden Sie unter CLabel.

Weitere Informationen zu angepassten Widgets finden Sie unter Creating your own widgets with SWT.

Copyright IBM Corporation und Andere 2000, 2003.