JFace Überblick, JFace Structured Viewers

JFace

SWT beschränkt sich auf die Bereitstellung eines APIs für die zugrundeliegenden GUI-Bibliotheken, weitergehende Komponenten werden in JFace bereitgestellt. Hier finden sich u.a.:

JFace Structured Viewer

JFace Structured Viewer stellen eine Abstraktion bereit, die Inhalte aus beliebigen Java-Datenstrukturen in einem Widget zur Anzeige bringt. Folgende Viewer stehen zur Verfügung:

JFace Combo-/ListViewer

Ein JFace ComboViewer ist ein JFace Structured Viewer. Er ist für die Verwaltung der Inhalte eines SWT Combo-Controls zuständig (analog JFace ListViewer):

JFace Viewer I

Einen ComboViewer kann zu einem bereits vorhandenen Combo-Control erzeugt werden:

ComboViewer comboViewer = new ComboViewer(someCombo);

Alternativ kann man dem Viewer die Erzeugung des Controls überlassen:

ComboViewer comboViewer = new ComboViewer(parentComposite, SWT.READ_ONLY);
Combo combo = comboViewer.getCombo();

Ein Viewer wird mit einem ContentProvider, LabelProvider und Input-Objekt versehen. Diese Objekte beschreiben die anzuzeigenden Daten:

Input-Objekt

Das Input-Objekt repräsentiert die anzuzeigenden Inhalte. Es kann sich um ein beliebiges Java-Objekt handeln:

comboViewer.setInput("1 2 3");

ContentProvider

Woher weiß der ComboViewer, wie mit diesem Eingabe-Objekt umzugehen ist? Dazu wird dem ComboViewer ein ContentProvider gesetzt. Der ContentProvider ist dafür zuständig, die Eingabedaten in eine dem Viewer verständliche Struktur zu bringen. Dazu muss er das Eingabeobjekt in ein Array von Zeilenobjekten konvertieren:

// Input object will be a String in this example, so we need to split the String
comboViewer.setContentProvider(new IStructuredContentProvider() {

    public Object[] getElements(Object inputElement) {
        return ((String) inputElement).split(" ");
    }

    /* ... */

});
comboViewer.setInput("1 2 3"); 

Bei diesen Zeilenobjekten kann es sich um beliebige Java-Objekte handeln. Jedes Zeilenobjekt im zurückgegebenem Array wird zu einer Auswahloption in der Combo-Box.

Liegt das Input-Objekt bereits als Java-Array oder Java-Collection vor, muss man den ContentProvider nicht selbst implementieren, sondern kann einen ArrayContentProvider verwenden:

// Input object will be a Collection here, so we use ArrayContentProvider
comboViewer.setContentProvider(ArrayContentProvider.getInstance());
comboViewer.setInput(someCollection);

LabelProvider

Der LabelProvider ist dafür zuständig, zu einem Zeilenobjekt die zur Anzeige benötigten Informationen wie Label oder Bild zu liefern:

comboViewer.setContentProvider(ArrayContentProvider.getInstance());
comboViewer.setLabelProvider(new LabelProvider() {
        
    @Override
    public String getText(Object element) {
        SomeObject element = (SomeObject) element;
        return element.getName();
    }

});
comboViewer.setInput(someCollection);

Der setInput-Aufruf sollte immer zuletzt erfolgen, da es die Befüllung der Combo-Box auslöst. Zu diesem Zeitpunkt muss bereits ein Content- und LabelProvider gesetzt sein.

Selektion

An die aktuelle Selektion eines JFace-Viewers gelangen Sie über getSelection():

ISelection selection = someViewer.getSelection();

Das zurückgegebene Interface ISelection ist ein sehr allgemeines Interface. Selektionen, die Elemente beinhalten, werden als IStructuredSelection abgebildet. Alle StructuredViewer geben eine IStructuredSelection zurück. Mittels der IStructuredSelection können Sie das erste selektierte Element abfragen oder über alle selektierten Elemente iterieren:

IStructuredSelection structuredSelection = (IStructuredSelection) selection;
if (!structuredSelection.isEmpty()) {
    // get first element ...
    Object firstElement = structuredSelection.getFirstElement();

    // or iterate over all elements
    for (Iterator iterator = structuredSelection.iterator(); iterator.hasNext();) {
        Object element = iterator.next();
    }
}

Sie können zudem die aktuelle Selektion mit einem ISelectionChangedListener beobachten:

someViewer.addSelectionChangedListener(new ISelectionChangedListener() {

    public void selectionChanged(SelectionChangedEvent event) {
        // Handle selection changed event here
        ISelection selection = event.getSelection();
    }
    
});

Eclipse RCP

Eclipse RCP eBook

Die Entwicklung von Desktop-Anwendungen mit der Eclipse Rich Client Platform anschaulich erklärt in 23 Kapiteln. Mit über 20 ausführlichen Schritt-für-Schritt-Tutorials zur Entwicklung einer RCP-Beispielanwendung. Ab sofort erhältlich als eBook in den Formaten PDF und MOBI (geeignet für Kindle und Kindle Reading Apps)

Ralf Ebert

Ralf Ebert schreibt und publiziert das eBook “Eclipse RCP - Entwicklung von Desktop-Anwendungen mit der Eclipse Rich Client Platform 3.7”. Darin vermittelt er seine Kenntnisse und Erfahrungswerte aus zahlreichen RCP-Projekten, die er als Entwickler erfolgreich umgesetzt und als Berater begleitet hat. Seit 2006 hat er in mehr als 50 Schulungsveranstaltungen die Verwendung des Eclipse RCP-Frameworks geschult.