2012-12-13 53 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

相关问题