2012-10-03 22 views
0

我有這樣的代碼:gwt:如何使用setEventListener?

DOM.setEventListener(row.getElement(), new ClickListener(){ 

    @Override 
    public void onClick(Widget sender) { 
    // TODO Auto-generated method stub 

    }}); 

我認爲的代碼是罰款和ClickListener延伸EventListener,但它給錯誤說:The method setEventListener(Element, EventListener) in the type DOM is not applicable for the arguments (Element, new ClickListener(){})

回答

3

真正的答案是,你可能不知道。雖然這可用於將偵聽器附加到事件,但每個元素只能附加一個偵聽器 - 然後偵聽所有已配置的dom事件(請參閱DOM.sinkEvents) - 並且您有責任確保在頁面之前分離所有偵聽器卸載,否則一些瀏覽器會泄漏內存。

相反,強烈考慮使用Widget(和子類)來管理事件。 RootPanel是其他人應該添加到的基本小部件,它將管理從頁面中分離所有其他小部件以防止內存泄漏。

另外,您還可以根據您之後發生的事件類型來聆聽發生在那裏的事件。例如,即使像標籤的部件,這並不」正常火鼠標懸停事件,你仍然可以連接處理器,並得到通知:

Label label = new Label(); 
label.addDomHandler(new MouseOverHandler() { 
    @Override 
    public void onMouseOver(MouseOverEvent event) { 
    // do something 
    } 
}, MouseOverEvent.getType()); 
RootPanel.get().add(label); 

在大多數情況下,你將使用現有的支持方法,如按鈕得到單擊事件 - 有舒適的方法已經有你,感謝接口,如HasClickHandlers

Button button = new Button(); 
button.addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
    // do something 
    } 
}); 
panel.add(button); 

更多關於GWT,窗口小部件和內存泄漏:

+0

感謝您的詳細答覆!我必須使用DOM的原因是因爲處理程序定義是在一個循環內部,這個循環也在匿名對象層次結構的兩個級別(也許我不應該這樣做)。發件人是一個組合內的按鈕,在RootPanel中,有很多這樣的組合,所以我用一個循環來初始化它們。但它一直告訴我,我的局部變量不是最終的,所以我不能得到對outter對象的引用,即使我使用了'OutterClass.this'。因此,我必須在層次結構之外使用DOM ... – texasbruce

+0

但是,在大多數情況下,我使用小部件來包含事件處理程序,並且感謝有關sinkEvent和內存泄漏的提示! – texasbruce

+0

您可以執行以下操作。在循環內部聲明一個最終變量並給它你想要的值。 for(int i = 0; i <10; i ++){final int y = i;等等}。那麼你可以使用y變量在處理程序定義中引用它。 –