Frage

Ich habe einen JFace-Editor, der zum größten Teil aus einem TreeViewer gemacht wird. Dies wird zu einem ContentOutlinePage angeschlossener Gliederungsansicht zum Leben zu bringen.

Wenn einer eine SelectionChangedEvent nennen sie empfängt die anderen setSelection() Methode ... und darin liegt das Problem. setSelection() erzeugt eine weitere SelectionChangedEvent ... und somit der Endlosschleife verbunden wird.

Gibt es ein Mittel, zu sagen, wenn die SelectionChangedEvent durch tatsächliche Interaktion mit dem Benutzer erstellt wurde und nicht durch ein anderes Objekt aufrufen setSelection()?

Gibt es ein besseres Mittel noch diese Art von tödlicher-umarmen stoppen?

Clues begrüßt.

War es hilfreich?

Lösung

Im Allgemeinen würden Sie eine Flagge am Anfang der Routine überprüfen, um zu überprüfen, um zu sehen, wenn Sie in der Mitte der Event-Handler sind. Wenn das Flag gesetzt ist, dann beenden Sie ohne zu verarbeiten.

Wenn das Flag nicht gesetzt ist, setzen Sie das Flag, zu verarbeiten, dann wird das Flag zurückgesetzt.

Andere Tipps

Ein weiteres Muster, das funktioniert, ist das Ereignis-Listener zu entfernen, um die Auswahl zu machen, fügen Sie die Eventlistener wieder zurück. Dadurch wird sichergestellt, dass es eine einzige Stelle im Code, wo Sie darüber Sorgen zu machen -. Mit einer Fahne würden Sie gleichzeitig zwei Stellen pflegen müssen

Auch die SelectionChangedChanged möglicherweise ist (nicht sicher, obwohl) setzte auf das Ereignisstack (dh ausgeführt asynchron). In diesem Fall minimieren Sie auch den Zeitraum, in dem der Betrachter keine Benachrichtigung ausbreitet.

Insgesamt finde ich es enttäuschend, dass der SelectionChangedEvent erzeugte das gleiche ist, unabhängig davon, ob eine Maus geklickt wurde. Ich nehme an, es ist nicht so einfach, das zu tun, wie man hoffen würde. Ich hatte einmal ein Texteditor Klasse Verhalten zu ändern, so dass es sich um zwei Arten von Einsatz Ereignissen neu (Benutzer generierte und Netzwerk erzeugt), um gemeinsam genutzt, dass die Texteditor-Klasse zu machen. Ich würde gerne mehr Diskussion, das sehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top