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

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

您必须将源对象强制转换为您期望的对象。 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按钮:

 @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")); } } 

如果您不知道元素的类型,或者事件绑定到多个元素,则必须首先检查所有可能的类型,然后执行正确的操作。

如果你想要一个方法来处理一堆小部件的点击事件,那么它就像下面这样简单:

 @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. } 

如果你想在一堆元素上使用事件委托 ,那么你需要监听祖先上的click事件,然后你可以使用event.getNativeEvent().getEventTarget()来获取作为目标的实际元素。单击。 然后,您可以在Element上使用isOrHasChild来了解click的实际目标是否在该元素内(例如firstElement.isOrHasChild(Element.as(event.getNativeEvent().getEventtarget())) ,其中firstElement@UiField Element – 或任何子类或Element ,如DivElement