Eclipse RCP mit eigenem Listener (kein SelectionListener)

Nightshifter

Grünschnabel
Hallo allerseits,

ich habe nun zwei Tage lang verschiedene Möglichkeiten gesucht einen eigenen Listener für eine Eclipse RCP Anwendung zu implementieren und bin nicht wirklich schlauer geworden. Ich möchte an dieser Stelle mal eine Lösung vorstellen, die funktioniert, aber in meinen Augen nicht wirklich schön ist.

Das Problem:
Ein View (bzw. Widgets in dieser View) soll über Änderungen in einem anderen View (bzw. Widgets) informiert werden und darauf reagieren, dabei handelt es sich um kein SelectionEvent oder ähnliches. Als Beispiel nehme ich hier mal einen Baum, bei dem Knoten gelöscht werden können. Eine Andere View soll mitbekommen welche Knoten gelöscht wurden und sich dementsprechend aktualisieren.
Da die beiden Views aber nicht voneinander wissen und ich von der einen View auch nicht auf die andere komme, habe ich folgendes umgesetzt.

Lösung:
Eine Klasse als Singleton, die alle vorhandenen Trees und Listener enthält:
Java:
public class TreeEventAgent
{
    private static TreeEventAgent instance  = new TreeEventAgent();

    private static List<ElementTree> trees     =
        new ArrayList<ElementTree>(0);

    private static List<ElementTreeListener> listeners =
        new ArrayList<ElementTreeListener>(0);

    private TreeEventAgent()
    {
    }

    public static TreeEventAgent getInstance()
    {
        return instance;
    }

    public void registerTree(ElementTree tree)
    {
        if (!trees.contains(tree))
        {
            trees.add(tree);
        }
        for (ElementTreeListener listener : listeners)
        {
            tree.addListener(listener);
        }
    }

    public void registerListener(ElementTreeListener listener)
    {
        if (!listeners.contains(listener))
        {
            listeners.add(listener);
        }
        for (ElementTree tree : trees)
        {
            tree.addListener(listener);
        }
    }
}

Nach der initialisierung eines Trees, welcher die Events feuert und dabei alle seine Listener informiert, rufe ich dann folgendes auf:
Java:
ElementGroupTreeEventAgent.getInstance().registerTree(myTree);
Damit werden alle registrierten Listener myTree als Listener hinzugefügt

Und nach der Initialisierung eines Views(Widgets) welches auf den Listener implementiert:
Java:
ElementGroupTreeEventAgent.getInstance().registerListener(myTreeListener);
Dabei wird myTreeListener allen registrierten Trees als Listener hinzugefügt

Mich würden Eure Meinungen und oder Verbesserungsvorschläge bzw. alternativen Ansätze interessieren.
 
Hallo,

ein alternativer Ansätz wäre es beispielsweise einen lose entkoppelten EventBus zur Kommunikation zwischen Komponenten in der Anwendung zu verwenden. Damit schickst du in deinem Fall nur noch "Nachrichten" mit Daten und der Aktion deiner Datenänderung an den EventBus. Der EventBus verteilt dann die Nachrichten an alle registrierten Komponenten.

Gruß Tom
 
Hallo Thomas,

vielen Dank für die Info. Die Geschichte mit dem EventBus ist mir neu. Sieht sehr gut aus. So werde ich es machen.
 
Zurück