2010-11-23 64 views
5

我正在開發一些需要在swing和gwt中實現的簡單圖形軟件。在gwt方面,我將使用gwt-g2d作爲畫布。我希望能夠在兩種實現中使用事件總線來簡化一些軟件。你如何使用GWT的SimpleEventBus或EventBus?

我的理解是,它應該是這樣的:

  1. 實例化EventBus
  2. 實例化父控件,水槽要用於EventBus的事件(鼠標懸停或RPC回調,例如)
  3. 設置EventBus來監聽父窗口小部件的事件。
  4. 實例化子小部件,誰應該向EventBus註冊它擁有的偵聽器(他們是否需要註冊它們可能觸發的事件?)
  5. 當EventBus收到一個事件時,它應該做出有關該事件的決定,然後執行在那個決定中,是否意味着忽略它,改變事件類型,或者只是將它轉發給所有可用的子窗口小部件。

這是一般它應該如何工作? SimpleEventBus仍然有些新穎,但我無法在網上找到有關如何真正使用它的信息。

回答

2

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已經發生,並且你的記錄器可以得到一個通知,或者你的服務器監視器可以得到通知,並通知老闆某人選擇了一個區域,或者其他什麼。如果您只需取消選擇一個區域並選擇另一個區域,事件總線就會過度殺傷。

另一方面,類似於「調整大小」的事件很有意義,因爲所有的小部件可能都需要了解它。

0

就我所瞭解的GWT EventBus而言,它指的是應用程序範圍內的事件(想想「systemwide object x chanded property y」;任何監聽該特定事件的東西都可以採取行動)。這可以幫助您分離您的應用程序邏輯。

您可能不希望觸發任何UI事件:您的父窗口小部件可以實現處理程序,或者您可以使用匿名實例。

+0

我認爲它的魅力的一部分是,它使得使用UI事件注入的自動化測試用例更加容易。無論如何,我試圖這樣做的原因是因爲一個畫布可能有4個圖形區域,而這些區域可能有4個圖形對象。如果我點擊一個圖形對象,我需要運行一些邏輯來查看哪一個被選中,因爲一個點可能會重疊。我的自定義事件將會是諸如調整大小,新數據,新數據窗口,新比例等等...... – Brian 2010-11-23 23:41:42

相關問題