2011-07-29 202 views
2

我對界面設計相當陌生,並且很難找出處理事件的最佳方式。在處理程序和(在這種情況下)按鈕導致事件在同一個類中的簡單情況下,這很好,我明白了。該處理器可以看到的按鈕,這樣就可以說:GWT事件處理最佳實踐

if (event.getSource() == myButton) 

而且,該處理器是在同一類,所以它可以添加標籤到對象局部的類或類似。

問題:我不知道應該如何處理處理程序和事件生成器處於不同類中的情況。

例如

從我的主佈局類創建並顯示自定義對話框。該對話框在其自己的類中實現。理想情況下,對話框會使用主佈局類中的處理程序(它實現ClickHandler),這很好,但我的應用程序有幾個不同的ClickEvents。我通過查看源代碼來區分它們。在這種情況下,按鈕在對話類中,所以我不能簡單地說:

if (event.getSource() == myDialogbutton) 

as myDialogBu​​tton不在範圍內。

任何提示如何這應該工作,將不勝感激。

d

回答

4

也許我可以幫你用我的解決方案...

我繼承函數clickhandler到自己的類,這是通用的。你可以給ClickHandler任何你想要的對象,並且可以從內部的方法訪問它。

例子:現在

import com.google.gwt.event.dom.client.ClickHandler; 

public abstract class ClickHandlerData<T> implements ClickHandler { 
    private T data; 

    public ClickHandlerData(T data) 
    { 
     this.data = data; 
    } 

    public T getData() 
    { 
     return data; 
    } 

    public void setData(T data) 
    { 
     this.data = data; 
    } 
} 

,在按鈕的情況下:

Button btn = new Button("click me"); 
btn.addClickHandler(new ClickHandlerData<Button>(btn)) { 
    public void onClick(ClickEvent event) { 
     Button btn = getData(); 
     ... 
    } 
} 

我使用這個類來傳似整數或別的東西對clickHandler參數。例如:

for (int i=0;i<10;i++) 
{ 
    Button btn = new Button("click me"); 
    btn.addClickHandler(new ClickHandlerData<Integer>(i)) { 
     public void onClick(ClickEvent event) { 
      Window.alert("you klicked button "+getData()); 
      ... 
     } 
    } 
} 

我也做了AsyncCallbacks一樣的,命令,一切我需要將數據傳遞到。

希望這對你有所幫助。

+0

謝謝,但這並不能真正幫助我解決問題。作爲對象B的成員的按鈕無法與對象A的Click處理器實現中的event.getSource()進行比較。我能做的唯一事情就是將對象A的引用傳遞給對象B,然後在對象A中引入一個方法,我從對象B調用它,該對象現在也實現了ClickHandler。我希望事件能夠分配我可以使用的獨特名稱。 – dpwr

1

在我看來,你正在試圖爲多個按鈕使用一個偵聽器,除非幾個按鈕具有相同的功能,他們應該有不同的偵聽器。

一般而言,您應該嘗試爲每個函數使用一個偵聽器,而不是每個「事件生成器」使用一個偵聽器。

如果您有例如一個註銷按鈕,它可能會有一個來自LoginStatusWidget的監聽器(顯示客戶端的登錄身份)以及來自可註銷註銷服務器響應對象的監聽器。

這將有助於分離彼此的組件。

0

起初,我建議您嘗試收集您的按鈕及其ClickHandlers在同一個班,但如果你的情況是不可能的,我有一個建議給你:

當你創建你的按鈕你可以添加一些信息對他們說:

Button button = new Button("submit"); 
button.setLayoutData(someObj); 

然後點火事件後,你可以從事件得到您的按鈕在你的clickHandler事件,並找出是哪個按鈕:

Button button = (Button) event.getSource(); 
MetaData someObj = (MetaData) button.getLayoutData(); 
1

嘗試爲每個匿名或連續小部件創建一個新偵聽器,例如FlexTable中的按鈕。這樣他們的生命週期就連接起來了,它們只能互相引用。

  1. 擴展插件
  2. 給它一個ID,並將其添加到構造[確保ID是獨一無二的]
  3. 實現監聽器類。
  4. 每次創建相同類型的項目時都會創建偵聽器的新實例。
  5. 我猜測有連接到小部件的特定對象。如果這樣保持一個HashMap。

願力量與你同在

0

你就不能這樣做:

final Button source= new Button("My Button"); 

button.addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
     doSomething(source); 
    } 
} 

注按鈕實例必須被標記爲final。