2010-11-18 48 views
1

我一直在試圖讓多個演示者「聽」同一個事件,但我要讓每個事件對演示者都是唯一的。爲多個附加gwt小部件區分事件

Ex。 我在一個不同的選項卡中創建3個複合小部件。他們都綁定在同一個事件上。我們稱之爲「NewPrescriptionEvent」。如果這個事件被解僱,我所有的3個複合材料將嘗試DO這項工作。我只想讓他們中的一個去做。

我發現要做到這一點的唯一方法是通過創建一個臨時事件ID(事件內部的整數)來檢查每個正試圖響應事件的小部件。

代碼片斷

private class OnNewPrescription implements NewPrescriptionHandler { 

    @Override 
    public void onNewPrescription(NewPrescriptionEvent event, int dataObjectId) { 

     if (getDataObject().getPatientId() == dataObjectId) { 
     ... 
     } 
    } 
} 

在結合我做平常:

eventBus.addHandler(NewPrescriptionEvent.TYPE, new OnNewPrescription()); 

事件:

public class NewPrescriptionEvent extends GwtEvent<NewPrescriptionHandler> { 

    public static final GwtEvent.Type<NewPrescriptionHandler> TYPE = new GwtEvent.Type<NewPrescriptionHandler>(); 

    private int dataObjectId; 

    public NewPrescriptionEvent(int dataObjectId) { 
     this.dataObjectId = dataObjectId; 
    } 

    @Override 
    protected void dispatch(NewPrescriptionHandler handler) { 
     handler.onNewPrescription(this, dataObjectId);  
    } 

    @Override 
    public GwtEvent.Type<NewPrescriptionHandler> getAssociatedType() { 
     return TYPE; 
    } 
} 

我在想該類型必須是互不相時間,但仍然是同一事件。有沒有人有建議?

Thx。

+0

您正在使用事件系統'安排'客戶端處理?如果您只需要_something_來處理事件,則創建另一個只偵聽觸發處理的事件的小部件。如果您將事件處理程序添加到不應該處理該事件的小部件,則會發生一些奇怪的事情。也許你需要更多的事件類型,或者其他什麼。 – 2010-11-18 16:10:13

+0

如果您要使用相同的事件,並且只希望三個處理程序中的一個實際執行某些操作,則使用與該事件一起傳遞的變量將會起作用。雖然你的示例代碼看起來有些混亂。您是否在尋找解決此問題的其他建議,或者您是否想要幫助修復代碼? – dagge 2010-11-18 16:14:53

回答

2

這種情況下,您有相同演示者的任意數量的實例,並且都在監聽相同的事件類型嗎?並且每位演示者都「控制」了一個不同的實體,因此應該只對來自該實體的事件做出反應?如果是這樣的話,我所看到的唯一解決方案就是按照你的做法參數化事件。

+2

這是正確的答案,假設斷言是正確的:相同窗口小部件類型的多個實例。 – 2010-11-18 18:07:22

0

我認爲問題的標題就是你的答案。

您需要針對每個小部件使用不同的事件類型。

1

聽起來像EventBus可能不是這裏最好的方法;這是我個人對EventBus所遇到的主要問題之一:所有事件都是全球性的,很難區分給定類型的不同事件。

一套良好的異步事件處理沒有共享EventBus規則是:

  • 通信通過直接的方法調用子部件。
  • 通過回調/處理程序/偵聽器與父窗口小部件通信。
  • 避免(這裏可能跑題了)兄弟部件的直接知識

所以,包含3個標籤可以附加回調到每一個被調用時,每個事件分派給其相應的事件處理程序選項卡中的小部件(相信主持人,就你而言)。

不需要全局通信,不需要知道源或目的地,只有一種事件類型,一種可重複使用的選項卡控件類型,並且選項卡類保持簡單。原則上,與將ValueChangeHandler添加到CheckBox(畢竟,不通過事件總線訂閱複選框事件,您只需將處理程序直接添加到窗口小部件)不會有太大不同。

草圖:

public class TabContainer implements IsWidget { 
    public TabContainer() { 
    tab1.addNewPrescriptionHandler(
     new NewPrescriptionEventHandler() { 
      @Override 
      public void handleNewPrescriptionEvent(NewPrescriptionEvent event) { 
      handleTab1Event(event); 
      } 
     }); 
    tab2.addNewPrescriptionHandler(
     new NewPrescriptionEventHandler() { 
      @Override 
      public void handleNewPrescriptionEvent(NewPrescriptionEvent event) { 
      handleTab2Event(event); 
      } 
     }); 
    ... 
    } 
} 

而且你甚至可以簡化與一些循環和配對。

換個角度來說,這個容器也可以用另一種方式發回事件你的小部件使用相同的原理從任何地方。

此外,根據Event類包含的內容,您可能甚至不需要Event類;不過,你可以定義你的回調和參數。