我正在使用UIBinder在GWT上开发一个应用程序,我遇到了问题。在我的用户界面中可以有很多相同的元素(例如小部件)。所有元素都必须具有捕获鼠标单击事件的处理程序。我想编写一个通用处理程序,它将能够识别导致事件并处理它的窗口小部件。现在我为每个对象都有一个小部件来描述同一个处理程序。我该如何解决这个问题?
答案 0 :(得分:7)
您必须将源对象强制转换为您期望的对象。 getSource()方法只为您提供一个对象,但您无法从中访问任何信息(例如,从Button,您首先必须将其转换为按钮)。
以下是一个例子:
Button bt = new Button("click");
bt.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Object soruce = event.getSource();
if (soruce instanceof Button) { //check that the source is really a button
String buttonText = ((Button) soruce).getText(); //cast the source to a button
RootPanel.get().add(new Label(buttonText));
} else {
RootPanel.get().add(new Label("Not a Button, can't be..."));
}
}
});
RootPanel.get().add(bt);
这当然也适用于UiBinder Buttons:
@UiHandler("button")
void onClick(ClickEvent e) {
Object soruce = e.getSource();
if(soruce instanceof Button){
String buttonText = ((Button)soruce).getText();
RootPanel.get().add(new Label(buttonText));
}
else {
RootPanel.get().add(new Label("The event is not bound to a button"));
}
}
如果您不知道元素的类型,或者事件绑定到多个元素,则必须先检查所有可能的类型,然后执行正确的操作。
答案 1 :(得分:1)
如果您想要一种方法来处理一堆小部件的点击事件,那么它就像以下一样简单:
@UiHandler({ "firstWidget", "secondWidget", "thirdWidget", "fourthWidget", andSoOn" })
void universalClickHandler(ClickEvent event) {
// here, you can use event.getSource() to get a reference to the actual widget
// that the event targeted.
}
如果你想在一堆元素上使用事件委托,那么你需要在祖先上监听点击事件,然后你可以使用{{1获取作为点击目标的实际元素。然后,您可以event.getNativeEvent().getEventTarget()
使用isOrHasChild
来了解点击的实际目标是否在该元素内(例如Element
,firstElement.isOrHasChild(Element.as(event.getNativeEvent().getEventtarget()))
为firstElement
- 或任何子类或@UiField Element
,例如Element
)