2012-12-13 70 views
1

我有添加了TextArea的smartgwt畫布。我想處理MouseDown事件並在用戶單擊畫布上的任何位置時更改其邊框。我的代碼看起來像這樣。當我包含在畫布文本區域單擊SmartGWT:單擊畫布的子元素時處理鼠標

final com.smartgwt.client.widgets.Canvas can = new com.smartgwt.client.widgets.Canvas(); 
can.setCanFocus(true); 
can.setBorder("2px Solid Blue"); 
can.setCanDragResize(true); 
TextArea ta = new TextArea(); 
can.addChild(ta); 
can.addMouseDownHandler(new MouseDownHandler() { 

      @Override 
      public void onMouseDown(MouseDownEvent event) { 

       ChangeCanvasBorder(can); 

      } 
     }); 

MouseDown事件不會觸發。有沒有辦法處理點擊畫布子元素?

我是新來的gwt。我可能錯過了一些配置。

作爲替代方案,我嘗試了gwt的FocusPanel,當TextArea添加到FocusPanel時,我能夠接收到MouseDown。

我使用的是smartgwt 2.4和gwt 2.4。

非常感謝您的幫助。

+0

如果我是正確的,那麼TextArea是一個GWT控件。應儘可能避免混用SmartGWT和GWT小部件,否則在嘗試修復其創建的所有佈局問題時會遇到許多麻煩。在處理SmartGWT時,您應該會遇到很多古怪和非直觀且不明顯的行爲。 SmartGWT也非常重,即使在適度的電腦上,它也會運行緩慢。無論如何,SmartGWT公開TextAreaItem,你需要插入到表單小部件。 – ZalewaPL

+0

@ZelwaPL,感謝您的快速回復。同意你的看法,我改變了我的項目,儘可能地堅持使用SmartGWT小部件。 – user1899956

回答

1

正如ZalewaPL所說,最好避免混合gwt和smartgwt小部件。我建議你使用從添加到DynamicForm的smartgwt中的TextAreaItem。下面是一個簡單的例子:

final Canvas can = new Canvas(); 
can.setCanFocus(true); 
can.setBorder("2px Solid Blue"); 
can.setCanDragResize(true); 
DynamicForm form = new DynamicForm(); 
TextAreaItem tai = new TextAreaItem("textarea"); 
form.setFields(tai); 
can.addChild(form); 
can.addMouseDownHandler(new MouseDownHandler() { 

    @Override 
    public void onMouseDown(MouseDownEvent event) { 
     changeCanvasBorder(can); 
    } 
}); 

但是,如果你仍然想要使用GWT的文本區域窗口小部件,那麼你可以這樣做:

abstract class CustomMouseDownHandler implements com.smartgwt.client.widgets.events.MouseDownHandler, com.google.gwt.event.dom.client.MouseDownHandler { 
    @Override 
    public void onMouseDown(com.smartgwt.client.widgets.events.MouseDownEvent event) { 
     onMouseDown(); 
    } 

    @Override 
    public void onMouseDown(com.google.gwt.event.dom.client.MouseDownEvent event) { 
     onMouseDown(); 
    } 

    public abstract void onMouseDown(); 
} 

final Canvas can = new Canvas(); 
can.setCanFocus(true); 
can.setBorder("2px Solid Blue"); 
can.setCanDragResize(true); 
TextArea ta = new TextArea(); 
CustomMouseDownHandler mdh = new CustomMouseDownHandler() { 

    @Override 
    public void onMouseDown() { 
     changeCanvasBorder(can); 
    } 
}; 
ta.addMouseDownHandler(mdh); 
can.addChild(ta); 
can.addMouseDownHandler(mdh); 

這一個創建一個新的處理程序抽象類,它實現兩個MouseDownHandler接口並將其onMouseDown方法轉發給一個新的onMouseDown方法。您必須爲此抽象類創建一個實現,並將其用於Canvas和TextArea小部件。

+0

謝謝你的答案。我選擇第一個建議。現在能夠聽到mousedown事件。 – user1899956

相關問題