2010-06-08 73 views
12

可能是一個愚蠢的問題,但GWT FlowPanel(原始div元素)沒有提供處理鼠標點擊/鼠標移動的東西。重寫onBrowserEvent也不起作用。GWT:什麼是處理方式點擊GWT FlowPanel

如果使用原生JavaScript設置onclick事件(如果未指定,需要指定正高度,'div'的高度爲0),那麼捕獲這些事件正常工作。有沒有辦法做到這一點,而不使用JSNI?

回答

18

你需要做的是將你的FlowPanel包裹在FocusPanel中。一個FocusPanel包含所有可能的處理程序,因此可以讓你設置一個ClickHandler。

另一種方法是創建自己的窗口小部件,以擴展流程面板並實現必要的接口以便能夠包含ClickHandler。

我個人會推薦第一種方法。代碼更簡單,速度更快,並且不會減慢應用程序的運行速度。

0

似乎問題是愚蠢的,是的。 FlowPanel可以很容易地包裝或替換爲FocusPanel,它提供了很多監控/處理事件的方法。

+0

好吧,如果我理解FlowPanel和FocusPanel,你不能用FocusPanel替代FlowPanel,但你可以確定將一個FlowPanel包裝在一個FocusPanel中。 – Zwik 2010-06-08 12:35:36

+0

是的,'FocusPanel'是'SimplePanel'的實現,所以它不能包含多個子窗口小部件。但是如果你的'FlowPanel'只包含一個,你可以簡單地用'FocusPanel'來代替它:)。 – 2010-06-08 12:40:05

+2

那麼,只有一個孩子使用FlowPanel將毫無用處。 – Zwik 2010-06-09 15:26:45

8

其實,你去爲這樣的:

FlowPanel fPanel = new FlowPanel() { 
     @Override 
     public void onAttach() { 
      super.onAttach(); 
      super.addDomHandler(handler, ClickEvent.getType()); // handler is the instance   
                   // of your ClickHandler 
     } 
} 

乾杯!

+1

是的,這是一點點黑客攻擊,但如果用戶受到FlowPanel的限制,這個技巧可以爲他工作。謝謝 – 2011-02-01 08:25:01

+0

如果我可以給這個答覆多upvotes我會。 – saihgala 2013-10-09 05:05:05

5

這爲我工作(顯然,代替「你clickHandler事件」與您的函數clickhandler的名字):

FlowPanel field = new FlowPanel(); 

field.addDomHandler(YOUR CLICKHANDLER, ClickEvent.getType()); 
6

我發現這一點,最好的解決辦法是here

這個想法是擴展FlowPanel(或者確實是SimplePanel)來實現相關的處理程序接口,對於不需要FocusPanel的全部功能和焦點功能的情況來說,這是一個更加簡潔的選項。請看下圖:

public class MouseAwareFlowPanel extends FlowPanel implements 
HasMouseOverHandlers, HasMouseOutHandlers, HasClickHandlers 
{ 
    public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) 
    { 
     return addDomHandler(handler, MouseOverEvent.getType()); 
    } 
    public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) 
    { 
     return addDomHandler(handler, MouseOutEvent.getType()); 
    } 
    public HandlerRegistration addClickHandler(ClickHandler handler) 
    { 
     return addDomHandler(handler, ClickEvent.getType()); 
    } 
} 
+0

這對於那些不想接受所有類型事件的人來說也是一個很好的解決方案!謝謝! – 2011-11-02 20:51:37

0

只是包裝的FlowPanel用FocusPanel,這將會使準備的小部件爲其他用戶交互太:

來源:

FlowPanel flowPanel = new FlowPanel(); 
    FocusPanel focusPanel = new FocusPanel(flowPanel); 
    focusPanel.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      Window.alert("Hi!"); 
     } 
    });