如何从“事件”对象获取有此事件的对象?

时间:2012-03-22 15:35:05

标签: java events gwt

我正在使用UIBinder在GWT上开发一个应用程序,我遇到了问题。在我的用户界面中可以有很多相同的元素(例如小部件)。所有元素都必须具有捕获鼠标单击事件的处理程序。我想编写一个通用处理程序,它将能够识别导致事件并处理它的窗口小部件。现在我为每个对象都有一个小部件来描述同一个处理程序。我该如何解决这个问题?

2 个答案:

答案 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来了解点击的实际目标是否在该元素内(例如ElementfirstElement.isOrHasChild(Element.as(event.getNativeEvent().getEventtarget()))firstElement - 或任何子类或@UiField Element,例如Element