2010-08-09 64 views
23

我開始研究將GWT與UiBuilder結合使用。我有點疑惑,你如何使用@UiHandler(..)指令進行簡單的事件處理代碼作爲GWT documentation寫下來:@UiHandler的文檔

@UiHandler("button") 
void handleClick(ClickEvent e) { 
    Window.alert("Hello, AJAX"); 
} 

在這種情況下,方法​​使用。 您如何知道每個GWT小部件可以使用@UiHandler創建哪些方法?對於一些你也可以創建一個doClose()方法。

但是,你可以使用什麼,例如,ListBox來獲得一個項目被選中的事件?我可以在文檔中看到這個嗎?

回答

33

傳遞給@UiHandler註釋的參數是您想要指定的相應字段的名稱*Handler。因此,在這種情況下,您將ClickHandler分配給Button button(實際上,我們只知道該字段的名稱)。

至於如何正確工作 - 它是GWT魔法的一部分:)我的猜測是,就像任何其他與UiBinder相關的代碼(我認爲在Google IO上有一個演示文稿,顯示了UiBinder生成的代碼),在編譯時,編譯器會計算出哪裏出了什麼地方。在這個例子中:我們有一個Button button,我們有具有ClickEvent參數@UiHandler標註的方法 - >那必須意味着它是一個ClickHandler(注意方法名物質)。所以讓我們在編譯時添加一些代碼(可能是在構造函數中),將該處理程序添加到按鈕中。如果你有興趣在一個更全面的答案 - 查看源:d

但是你能與使用,爲 例如,ListBox得到一個項目被選中的事件 ?在 文檔中,我可以看到這個嗎?

GWT API reference。在這種情況下,您可能正在尋找ListBox.addChangeHandler。但你通常不會發現有@UiHandler相關的代碼 - 這是因爲它是多餘的 - 你總是構造@UiHandler方法以同樣的方式:

  1. 您檢查您要添加的*Handler,說ChangeHandler
  2. 它有一個void onChange(ChangeEvent event) - 所以,你的方法需要一個ChangeEvent參數應該是這樣的:

    @UiHandler("listBox") 
    void whateverName(ChangeEvent event) { 
        // ... 
    } 
    
+2

哇,這聽起來像是魔法。我不會自己想出這種通配符的行爲。 – Roalt 2010-08-10 07:57:34

+1

我建議從Google IO 2010和2009(甚至是2008)觀看GWT會話 - GWT團隊成員展示並解釋一些魔法:) – 2010-08-10 10:29:28

+0

Kilmer:感謝您的提示。我一定會那樣做的! – Roalt 2010-08-11 08:19:30

1

可能你的問題是在你的onModuleLoad方法中:

public void onModuleLoad() 
{  
    HelloWorld helloWorld = new HelloWorld("BOTAO"); 

    // Using this way @UiHandler will not work 
    //Document.get().getBody().appendChild(helloWorld.getElement()); 

    // correct way 
    RootPanel.get().add(helloWorld); 
} 
+0

謝謝!讓我頭痛 – Chaos 2013-12-29 02:08:34