Dialoge und Wizards
SWT Farbauswahl
ColorDialog colorDialog = new ColorDialog(parentShell);
colorDialog.setText("ColorDialog");
RGB selectedColor = colorDialog.open();
if (selectedColor != null) {
System.out.println(colorDialog.getRGB() + " was selected.");
}
SWT Ordner- und Dateiauswahl
DirectoryDialog directoryDialog = new DirectoryDialog(parentShell);
directoryDialog.setFilterPath("/");
directoryDialog.setMessage("Bitte wählen Sie einen Ordner aus:");
directoryDialog.setText("DirectoryDialog");
String selectedDirectory = directoryDialog.open();
if (selectedDirectory != null) {
System.out.println(selectedDirectory + " was selected.");
}
FileDialog fileDialog = new FileDialog(parentShell);
fileDialog.setFilterPath("/etc");
fileDialog.setFilterExtensions(new String[] { "*.conf" });
fileDialog.setFilterNames(new String[] { "Configuration files (*.conf)" });
fileDialog.setText("FileDialog");
String selectedFile = fileDialog.open();
if (selectedFile != null) {
System.out.println(selectedFile + " was selected.");
}
SWT Schriftauswahl
FontDialog fontDialog = new FontDialog(parentShell);
fontDialog.setText("FontDialog");
FontData selectedFont = fontDialog.open();
if (selectedFont != null) {
System.out.println(selectedFont + " was selected.");
}
SWT Druckdialog
PrintDialog printDialog = new PrintDialog(parentShell);
printDialog.setText("PrintDialog");
PrinterData printerData = printDialog.open();
if (printerData != null) {
System.out.println(printerData);
}
Nachrichtendialoge
Ein JFace MessageDialog zeigt dem Benutzer ähnlich zur SWT MessageBox eine Nachricht an. Es wird jedoch kein Systemdialog verwendet. So können z.B. eigene Buttons hinzugefügt werden:
MessageDialog messageDialog = new MessageDialog(parentShell, "MessageDialog", null,
"Some Message", MessageDialog.ERROR,
new String[] { "First Button", "Second Button" }, 1);
if (messageDialog.open() == 1) {
System.out.println("Second Button was clicked.");
}
Für Standard-Dialoge stehen auf MessageDialog statische Methodenaufrufe zur Verfügung:
MessageDialog.openConfirm(parentShell, title, message)
MessageDialog.openError(parentShell, title, message)
MessageDialog.openInformation(parentShell, title, message)
MessageDialog.openQuestion(parentShell, title, message)
MessageDialog.openWarning(parentShell, title, message)
In Eclipse werden häufig Status-Objekte eingesetzt, um Fehlerzustände zu kommunizieren. Möchten Sie dem Benutzer einen solchen Status anzeigen, können Sie die Klasse ErrorDialog verwenden:
Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Status message");
ErrorDialog.openError(parentShell, "ErrorDialog", "Message", status);
JFace Dialoge
Neben Standarddialogen finden Sie in JFace auch Basisklassen für eigene Dialoge. Die einfachste Basisklasse ist Dialog, ein modaler Dialog mit einer Buttonzeile unterhalb des Inhaltsbereiches:
Um einen solchen Dialog zu implementieren, leiten Sie eine Klasse von Dialog ab und implementieren die Methode createDialogArea, um den Dialog mit Inhalten zu befüllen. Wichtig zu beachten ist dabei: Der Dialog selbst wird mit einem GridLayout gelayoutet und daher wird erwartet, dass dem zurückgegebene Control ein GridData-Objekt zugewiesen ist. Dazu kann man super.createDialogArea aufrufen und das zurückgegebene Composite mit eigenen Inhalten befüllen:
Dialog dialog = new Dialog(parentShell) {
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
Label label = new Label(composite, SWT.NONE);
label.setText("Dialog Area");
return composite;
}
@Override
protected Point getInitialSize() {
return new Point(400, 300);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("Dialog");
}
};
if (dialog.open() == Dialog.OK)
System.out.println("User clicked ok.");
JFace TitleAreaDialog
Die Klasse TitleAreaDialog stellt einen Dialog mit Titelbereich mit Text und Symbol bereit:
Die Implementierung eines solchen Dialogs erfolgt analog zur Dialog-Klasse:
TitleAreaDialog titleAreaDialog = new TitleAreaDialog(parentShell) {
@Override
protected Control createDialogArea(Composite parent) {
LocalResourceManager resources
= new LocalResourceManager(JFaceResources.getResources(), getShell());
setTitle("Title");
setErrorMessage("Error message");
ImageDescriptor title = Activator.getImageDescriptor("/icons/imagetitle.png");
setTitleImage(resources.createImage(title));
Composite composite = (Composite) super.createDialogArea(parent);
Label label = new Label(composite, SWT.NONE);
label.setText("Dialog Area");
return composite;
}
};
JFace Auswahldialoge
JFace stellt einige Basisklassen bereit, die Sie verwenden können, um Auswahldialoge zu realisieren. Die einfachste Variante ist der ListDialog, der intern einen JFace ListViewer verwendet, um eine Auswahlliste zu präsentieren. Die Inhalte werden dabei analog zu einem ListViewer gesetzt:
ListDialog listDialog = new ListDialog(parentShell);
listDialog.setTitle("ListDialog");
listDialog.setMessage("Message");
listDialog.setContentProvider(ArrayContentProvider.getInstance());
listDialog.setLabelProvider(new LabelProvider());
listDialog.setInput(someList);
if (listDialog.open() == Dialog.OK) {
System.out.println("Selected objects: " + Arrays.toString(listDialog.getResult()));
}
Analog dazu stehen mit ElementTreeSelectionDialog und CheckedTreeSelectionDialog Dialogklassen bereit, die eine Einfach- oder Mehrfachauswahl aus einem Baum ermöglichen.
ElementTreeSelectionDialogCheckedTreeSelectionDialog
JFace Wizards
JFace Wizards sind Basisklassen für Assistenten, die den Anwender durch eine Reihe von Schritten führen:
Zur Erstellung eines Wizards benötigen Sie folgende Klassen:
Für jede Seite des Assistenten implementieren Sie eine WizardPage-Klasse:
public class SomeWizardPage extends WizardPage {
protected SomeWizardPage() {
super("Some wizard Page");
setTitle("WizardPage Title");
setMessage("WizardPage Message");
}
public void createControl(Composite parent) {
// createControl verlangt es, genau ein Control zu erstellen
// und dieses mit setControl zu setzen
Label label = new Label(parent, SWT.NONE);
setControl(label);
// Hier würde composite mit eigenen UI Elementen befüllt
// Mit setPageComplete(boolean) könnte man hier die Aktivierung
// der nächsten Wizard-Seite in Abhängigkeit vom UI erlauben oder verbieten
}
}
Für den Wizard selbst, also die Gesamtmenge aller Seiten, implementieren Sie die Klasse Wizard:
public class SomeWizard extends Wizard {
public SomeWizard() {
setWindowTitle("Window Title")
addPage(new FirstWizardPage());
addPage(new SecondWizardPage());
// ...
}
@Override
public boolean performFinish() {
// true zurückgeben wenn Wizard erfolgreich abgeschlossen wurde
return true;
}
}
Einen solchen Wizard können Sie nun mit WizardDialog verwenden:
WizardDialog wizard = new WizardDialog(parentShell, new SomeWizard());
wizard.open();
Eclipse UI: Wizards für Neu, Im- und Export
Neben den JFace Wizards stellt Ihnen die Eclipse Workbench drei Extension Points bereit, mit denen Wizards für Neu, Im- und Export registriert werden können:
org.eclipse.ui.newWizardsorg.eclipse.ui.importWizardsorg.eclipse.ui.exportWizards
Dabei ist eine Wizard-Klasse mit einem zusätzlichen Interface (INewWizard, IImportWizard bzw. IExportWizard) anzugeben, z.B.:
<extension point="org.eclipse.ui.newWizards">
<wizard
class="com.example.SomeNewWizard"
id="com.example.SomeNewWizard"
name="Neue Adresse">
</wizard>
</extension>
Ein so registrierter Wizard wird dem Benutzer über entsprechende Workbench-Commands angeboten:



Gratulation! Ein sehr hilfreiches Buch!
Ich wäre ihnen auch sehr dankbar, wenn sie weiterführende Links hinzufügen könnten, wenn man sich mit einem Thema( z. B. Wizards) näher beschäftigen will.