避免在每次点击时创建新的ClickHandler实例

时间:2011-04-07 12:40:13

标签: java gwt

我现在坐在这上面4个小时了,我再一次在Stackoverflow上,因为我无法解决这个(简单)问题。

我想点击一个按钮时触发一个方法,Google给出了一个如下例子:

// Listen for mouse events on the Add button.
addStockButton.addClickHandler(new ClickHandler() {
  public void onClick(ClickEvent event) {
    addStock();
  }
});

但这会创建一个新实例(?..每次单击按钮时,他们甚至可以创建一个Clickhandler实例,因为它是一个接口)。如何解决这个问题,即所有按钮共享一个Clickhandler,Handler会按下Button按钮,因此他可以触发附加到该按钮的方法。

任何想法?如果您要查看信息并且需要更多代码,请告诉我。

提前致谢, 丹尼尔

3 个答案:

答案 0 :(得分:2)

Java创建一个实现ClickHandler的匿名类的新实例。它可以做什么,因为您为接口指定的onClick函数提供了一个实现。

但是,当您单击按钮但是在调用addClickhandler时,不会创建此类。如果您需要多个事件的处理程序,请执行以下操作:

ClickHandler handler = new ClickHandler() {
  public void onClick(ClickEvent event) {
    addStock();
  }
};
addStockButton.addClickHandler(handler);
someOtherButton.addClickHandler(handler);

在处理程序中,您可以使用event.getSource()来识别事件的来源。

如果您可以访问按钮变量,只需检查指针

即可
if (addStockButton == event.getSource()) ...

或者您可以将getSource的结果转换为适当的类型并访问对象的属性/方法。

答案 1 :(得分:2)

Eelke已经回答了你的问题。我只想补充一点,如果您使用GWT的UiBinder功能,您可以实现您想要的效果:

@UiField
Button addStockButton;

@UiField
Button removeStockButton;

@UiHandler({ "addStockButton", "removeStockButton" })
void handleClickEvents(ClickEvent event)
{
    if (event.getSource() == addStockButton)
    {
        addStock();
    }
    else if (event.getSource() == removeStockButton)
    {
        removeStock();
    }
}

答案 2 :(得分:0)

它是接口的匿名实例,这就像声明一个实现该接口的新类一样。

我不得不问你为什么要这样做,你需要让ClickHandler包含对其父级的引用。您还需要使按钮可识别,以便您可以在ClickHandler的正文中选择正确的按钮。您是否需要只有一个实例那么糟糕,以至于您不能拥有多个匿名实例?