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:
Nach der initialisierung eines Trees, welcher die Events feuert und dabei alle seine Listener informiert, rufe ich dann folgendes auf:
Damit werden alle registrierten Listener myTree als Listener hinzugefügt
Und nach der Initialisierung eines Views(Widgets) welches auf den Listener implementiert:
Dabei wird myTreeListener allen registrierten Trees als Listener hinzugefügt
Mich würden Eure Meinungen und oder Verbesserungsvorschläge bzw. alternativen Ansätze interessieren.
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);
Und nach der Initialisierung eines Views(Widgets) welches auf den Listener implementiert:
Java:
ElementGroupTreeEventAgent.getInstance().registerListener(myTreeListener);
Mich würden Eure Meinungen und oder Verbesserungsvorschläge bzw. alternativen Ansätze interessieren.