Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法调用两次GWT_Java_Javascript_Gwt_Methods - Fatal编程技术网

Java 方法调用两次GWT

Java 方法调用两次GWT,java,javascript,gwt,methods,Java,Javascript,Gwt,Methods,我正在用GWT创建一个web应用程序。我有一个方法bookMode(),它用一些文本框、列表框等构建一个UI,并在对话框中显示它。我这样调用该方法: //listen for mouse events on the add button addButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { String check = Cook

我正在用GWT创建一个web应用程序。我有一个方法bookMode(),它用一些文本框、列表框等构建一个UI,并在对话框中显示它。我这样调用该方法:

//listen for mouse events on the add button
    addButton.addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {

            String check = Cookies.getCookie("role");
            if(check == "TopBeheerder") {   
                boolean currentMode = mode0.getValue();
                add addObject = new add();
                if(currentMode == true) {
                    addObject.bookMode();
                }
                if(currentMode == false) {
                    addObject.userMode();
                }   
            }
            else {
                BibPhp.notification("You don't have enough permissions.");
            }


        }
    });

当我使用GWT.log()函数时,我注意到这个方法被调用了两次。但是我用eclipse搜索函数搜索了我所有的代码,并且该方法没有被调用两次。我不知道GWT为什么这样做。方法userMode()也被调用两次。

当Java代码转换为HTML和Javascript时;java和javascript之间的平等性比较是不同的。因此,如果在HTML中有两个id相同的小部件(按钮),并逐个向每个小部件添加单击处理程序,那么同一小部件添加两次单击处理程序的可能性很高。尝试为按钮小部件设置不同的ID,这有助于我解决与多次单击处理程序调用相关的任何问题。

我的猜测是,不知何故,您添加了两次单击处理程序

我将执行以下操作来调试:

System.out.println("adding click handler!");
addButton.addClickHandler(new ClickHandler() { ...
如果您看到“添加单击处理程序!”打印两次,这就是您的答案


不久前,我在实现MVP模式时遇到了类似的问题。视图是静态的,只初始化了一次,但是每次请求位置时都会初始化演示者。每次初始化Presenter时,它都会绑定click事件,从而多次添加ClickHandler。

有两种方法可以解决此问题:

1) 将这两种方法放在激发两次的对象之后

Event.stopPropagation();
Event.preventDefault();
或者,如果您使用的是键/鼠标等处理程序,则只需将事件替换为arg0。 如果这还不停止叫它两次,就用第二种方法

(二) 在类中声明此变量->
private RegistrationHandler stopHandler

然后,当您添加单击/鼠标/按键处理程序时,请编写以下内容:

    stopHandler=addButton.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {

        String check = Cookies.getCookie("role");
        if(check == "TopBeheerder") {   
            boolean currentMode = mode0.getValue();
            add addObject = new add();
            if(currentMode == true) {
                addObject.bookMode();
            }
            if(currentMode == false) {
                addObject.userMode();
            }   
        }
        else {
            BibPhp.notification("You don't have enough permissions.");
        }

      stopHandler.removeHandler();<-----------------
    }
});
stopHandler=addButton.addClickHandler(新的ClickHandler(){
公共作废一次点击(点击事件){
字符串检查=Cookies.getCookie(“角色”);
如果(检查==“TopBeheerder”){
布尔currentMode=mode0.getValue();
add addObject=new add();
如果(currentMode==true){
addObject.bookMode();
}
如果(currentMode==false){
addObject.userMode();
}   
}
否则{
通知(“您没有足够的权限。”);
}

我对GWT按钮也有类似的问题

我在一个名为“Widgets.java”的类中创建了一个按钮,而没有在该类中编写侦听器。然后我将这个按钮用作“ClassName.ButtonName”,就像一个宏:“Widgets.myButton”

当然,在某个时刻,我从另一个类向这个引用的按钮添加了一个监听器,尽管我删除并清理了完整的根面板,但当我不得不用相同的名称重新绘制按钮时,这个按钮似乎保持了监听器的关联,并再次添加了一个新的监听器

所以每次我点击这个按钮,与之相关的函数都会运行两次

解决方案?只需停止使用按钮的“引用”,并在本地创建它

我读了这篇文章,这篇文章“启发”了我,让我找到了我的解决方案,只是想赚两分钱。

以下是我解决问题的方法: 我声明了一个如下的处理程序注册变量

private HandlerRegistration HandlerButton;
然后,当需要调用addbutton方法时,使用之前创建的变量

HandlerButton=addButton.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {

        String check = Cookies.getCookie("role");
        if(check == "TopBeheerder") {   
            boolean currentMode = mode0.getValue();
            add addObject = new add();
            if(currentMode == true) {
                addObject.bookMode();
            }
            if(currentMode == false) {
                addObject.userMode();
            }   
        }
        else {
            BibPhp.notification("You don't have enough permissions.");
        }

      event.stopPropagation();
      event.preventDefault();     
      HandlerButton.removeHandler();
    }
});

在方法结束时,您只需调用stopPropagation()、preventDefault()并删除处理程序,以确保它不会触发多次

只是为了澄清一下,您遇到的行为是,每次“onclick”都会执行两次单击处理程序代码事件?是的,当我单击addButton时,它会执行twiceOkay方法,看起来没有任何错误。我只想确保事件处理程序没有被无意中添加两次,即确保没有两次调用addClickHandler()。在调用addClickHandler()之前放置一个Window.alert()我已经添加了一个Window.alert()在onClick方法中,我得到了两次警报,我只单击了一次。我不知道为什么会这样。我在其他按钮上也有同样的问题,但不是所有按钮上都有。还有一些按钮我必须单击两次才能调用事件。将警报放在addButton.addClickHandler(…)下面并查看它是一次调用还是两次调用。您应该用小写字母命名变量:
handlerButton
。这是java惯例。