Wenn Sie einen asynchronen Ereignisbus haben und Ereignisse auslösen, sagen wir innerhalb des Modells, die in der Benutzeroberfläche abgefangen werden, haben Sie wahrscheinlich das folgende Problem:
Der registrierte Handler wird in einem Worker-Thread ausgeführt, aber alle UI-Swing-Änderungen müssen innerhalb des AWT-Ereignis-Threads ausgeführt werden. Das bedeutet, dass Sie alle Ihre Handler-Klone in EventQueue.invokeLater(...)
.
Das sieht nach einer Menge Standardcode aus. Ich frage mich, ob es eine intelligentere Lösung für dieses Problem gibt.
Wie wäre es mit einer Erweiterung des Guava-Eventbusses, die einen Handler für die Ausführung in einem speziellen Thread markiert? Dies könnte z.B. mit einer Annotation markiert werden. @ExecuteWithinEDT
:
class EventBusChangeRecorder {
@Subscribe @ExecuteWithinEDT void recordCustomerChange(ChangeEvent e) {
recordChange(e.getChange());
}
}