Wie Benutzerereignisse aus synthetischen Ereignissen erzählen?
-
20-08-2019 - |
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.
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.