我正在使用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()方法也被调用两次。
答案 0 :(得分:5)
当Java代码转换为HTML和Javascript时; java和javascript之间的相等比较是不一样的。因此,如果您在HTML中有两个具有相同ID的小部件(按钮)并逐个添加单击处理程序,则相同的小部件可能会将单击处理程序添加两次。尝试为按钮小部件设置不同的ID,这有助于我解决与多个单击处理程序调用相关的任何问题。
答案 1 :(得分:0)
我的猜测是,不知何故,你要两次添加ClickHandler。
我会做这样的事情来调试:
System.out.println("adding click handler!");
addButton.addClickHandler(new ClickHandler() { ...
如果您看到“添加点击处理程序!”打印两次,这是你的答案。
在实施MVP模式的过程中,我遇到了类似的问题。视图是静态的并且只初始化一次,但是每次请求Place时都会初始化Presenter。每次初始化Presenter时,它都会绑定click事件,然后多次添加ClickHandler。
答案 2 :(得分:0)
有两种方法可以解决此问题:
1)放置两次触发两次方法的对象
Event.stopPropagation();
Event.preventDefault();
或者只使用 arg0 替换事件,如果您使用的是键/鼠标等处理程序。 如果这不停止调用它两次,请使用第二种方式
2)
在类中声明这个变量 - > private RegistrationHandler stopHandler;
然后当你添加click / mouse / keypress处理程序时写下:
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.removeHandler()
放在哪里,你需要停止重复两次。
p.s:如果找不到removeHandler()
方法,请写stopHandler(.dot)
然后搜索方法
答案 3 :(得分:0)
我遇到了类似GWT按钮的问题。
我在名为“Widgets.java”的类中创建了一个Button,而没有在该类中编写监听器。然后我使用这个按钮作为“ClassName.ButtonName”,就像一个宏:“Widgets.myButton”。
当然,在某个时刻,我正在为另一个类的引用按钮添加一个监听器,虽然我正在删除并清理完整的RootPanel,但是当我不得不再次重新绘制具有相同名称的按钮时,它似乎听众已经关联的按钮KEPT再次添加了一个新的。
因此,每次单击该按钮时,与其关联的功能都会运行两次。
解决方案?只需停止使用Button的“引用”并在本地创建它。
我读了这个帖子并且“开悟”我达到我的解决方案,只是想赚两分钱。 :)
答案 4 :(得分:0)
以下是我如何解决它: 我声明了一个像这样的处理程序注册变量
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()并删除处理程序,以确保它不会触发多次