Java 方法调用两次GWT
我正在用GWT创建一个web应用程序。我有一个方法bookMode(),它用一些文本框、列表框等构建一个UI,并在对话框中显示它。我这样调用该方法: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
//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惯例。