SimpleEventBus提供了非常基本的功能,用於存儲處理程序集合,並在適當時調用event.dispatch()與所有相關處理程序。我不會說你從父窗口小部件「設置EventBus來監聽事件」。 SimpleEventBus沒有「父」的概念。相反,你傳遞一個對你的SimpleEventBus的引用。然後,任何對象都可以使用SimpleEventBus.fireEvent方法「激發事件」。沒有層次結構。
同樣,任何對象都可以使用SimpleEventBus.addHandler()來偵聽這些事件。這是最接近你的#4 - addHandler需要類型事件和處理程序,所以無論何時該類型的事件傳遞到fireEvent
(通過您的應用程序中的某些東西),該處理程序將傳遞給該事件。請注意,Event
是調用處理程序,而不是EventBus! EventBus只調用event.dispatch(theHandler),事件的程序員負責調用Handler中的函數。您的#5是不準確的,至少對於SimpleEventBus來說 - SimpleEventBus根本不檢查這些事件,除了查看哪些處理程序要調用。它不知道任何子窗口小部件或任何應用程序邏輯,也不會更改事件的類型。
您關於查看哪個區域被挑選的邏輯在EventBus中不適合 - 相反,您將創建一個執行邏輯並偵聽ClickEvents的處理程序。然後,該處理程序可以告訴選定的區域它直接被選中,或者你可以創建你自己的RegionSelectionEvent,你可以沿着一個EventBus開火,然後所有的區域可以被通知RegionSelection已經發生,並且你的記錄器可以得到一個通知,或者你的服務器監視器可以得到通知,並通知老闆某人選擇了一個區域,或者其他什麼。如果您只需取消選擇一個區域並選擇另一個區域,事件總線就會過度殺傷。
另一方面,類似於「調整大小」的事件很有意義,因爲所有的小部件可能都需要了解它。
我認爲它的魅力的一部分是,它使得使用UI事件注入的自動化測試用例更加容易。無論如何,我試圖這樣做的原因是因爲一個畫布可能有4個圖形區域,而這些區域可能有4個圖形對象。如果我點擊一個圖形對象,我需要運行一些邏輯來查看哪一個被選中,因爲一個點可能會重疊。我的自定義事件將會是諸如調整大小,新數據,新數據窗口,新比例等等...... – Brian 2010-11-23 23:41:42