为什么我们将HandlerRegistration放入方法然后我们无法删除Handler?

时间:2014-02-08 03:33:54

标签: java gwt

好的,我有很多Checkbox,当程序第一次运行时,它将addClickHandler所有复选框,当我重置程序时,我想清除所有Handler。

这是示例代码;

 private HandlerRegistration countryHandlerReg=null;
 private HandlerRegistration postCodeHandlerReg=null;
 public void resetVariables(){
        if(postCodeHandlerReg!=null){
            postCodeHandlerReg.removeHandler();
        }
        if(countryHandlerReg!=null){
            countryHandlerReg.removeHandler();
        }

 }
 public void addClickHandlerForCheckBox(HandlerRegistration handlerReg, CheckBox myCheckBox){
        handlerReg=myCheckBox.addClickHandler(new MyClickHandler(myCheckBox));
 }
 public void showData(){
     resetVariables();
     addClickHandlerForCheckBox(postCodeHandlerReg, getView().getPostCodeCheckBox());
     addClickHandlerForCheckBox(countryHandlerReg, getView().getCountryCheckBox());
 }

有一个按钮可以调用showData()

以上代码无法正常运行,因为它无法运行.removeHandler()所以如果我单击按钮2或3次,则每个复选框将有2或3 MyClickHandler()

但是,如果我在不使用方法showData()的情况下更改addClickHandlerForCheckBox,那么它运行正常:

public void showData(){
     resetVariables();
     postCodeHandlerReg= getView().getPostCodeCheckBox().addClickHandler(new MyClickHandler(getView().getPostCodeCheckBox()));
 ....
 }

所以我认为如果我使用addClickHandlerForCheckBox方法,那么它就无法删除处理程序。

你知道为什么吗?或者我做错了什么?

2 个答案:

答案 0 :(得分:3)

执行此类更改,将删除处理程序

public HandlerRegistration addClickHandlerForCheckBox(CheckBox myCheckBox) {
 return myCheckBox.addClickHandler(new MyClickHandler(myCheckBox));
}
public void showData() {
  resetVariables();
  postCodeHandlerReg = addClickHandlerForCheckBox(postCode);
 countryHandlerReg = addClickHandlerForCheckBox(country);
}

答案 1 :(得分:0)

对于JCheckBox,您可以添加和删除这样的侦听器:

public static void main(String [] args)
{
    JCheckBox checkBox = new JCheckBox();
    checkBox.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent arg0) {
            // TODO Auto-generated method stub

        }
    });

    ItemListener [] itemListeners = checkBox.getListeners(ItemListener.class);
    System.out.println(itemListeners.length);
    for (int i = 0; i < itemListeners.length; i++)
    {
        checkBox.removeItemListener(itemListeners[i]);
    }
    System.out.println(checkBox.getListeners(ItemListener.class).length);
}

看起来你正在使用一些自定义类。因此,如果此示例没有帮助,您可能希望发布addClickHandler和removeHandler的代码。

我假设您在CheckBox上保留了一个处理程序列表,因此您可以添加一些方法,如CheckBox.removeListeners,只清除列表。