GWT事件防止默认不在Java中工作

GWT事件防止默认不在Java中工作,java,events,gwt,Java,Events,Gwt,我是GWT的新手,需要右键单击才能工作。我读过的文档建议我需要重写onBrowserEvent()方法。我只是在这个阶段做实验。事件将被处理并显示“我的”弹出窗口。但是,一旦我关闭弹出窗口,通常的浏览器下拉菜单就会出现(带有“将此页面添加书签”等选项) 我使用的是IceWeasel 24.5.0(FireFox克隆,用于Debian)和Debian(wheezy) 以下是相关代码: public ActivityTextCell() { super(BrowserEvents.MOUSE

我是GWT的新手,需要右键单击才能工作。我读过的文档建议我需要重写onBrowserEvent()方法。我只是在这个阶段做实验。事件将被处理并显示“我的”弹出窗口。但是,一旦我关闭弹出窗口,通常的浏览器下拉菜单就会出现(带有“将此页面添加书签”等选项)

我使用的是IceWeasel 24.5.0(FireFox克隆,用于Debian)和Debian(wheezy)

以下是相关代码:

public ActivityTextCell() {
    super(BrowserEvents.MOUSEDOWN, BrowserEvents.MOUSEUP);
}

@Override
public void onBrowserEvent(
        com.google.gwt.cell.client.Cell.Context context,
        Element parent, 
        ActivityDTO value, 
        NativeEvent event,
        ValueUpdater<ActivityDTO> valueUpdater) {

    super.onBrowserEvent(context, parent, value, event, valueUpdater);
    event.preventDefault();
    event.stopPropagation();
    if (event.getType().equals(BrowserEvents.MOUSEUP)) {
        Window.alert("mouse up event");

    }
    else {

        switch ( event.getButton()){
        case NativeEvent.BUTTON_RIGHT:
            Window.alert("right mouseclick");
            break;
        case NativeEvent.BUTTON_LEFT:
            Window.alert("left mouseclick");
            break;
        case NativeEvent.BUTTON_MIDDLE:
        default:
            break; // Do nothing
        }
    }
public ActivityTextCell(){
超级(BrowserEvents.MOUSEDOWN、BrowserEvents.MOUSEUP);
}
@凌驾
公开无效onBrowserEvent(
com.google.gwt.cell.client.cell.Context上下文,
元素父元素,
活动值,
NativeEvent事件,
ValueUpdater(ValueUpdater){
onBrowserEvent(上下文、父级、值、事件、值更新程序);
event.preventDefault();
event.stopPropagation();
if(event.getType().equals(BrowserEvents.MOUSEUP)){
Window.alert(“鼠标向上移动事件”);
}
否则{
开关(event.getButton()){
案例NativeEvent.BUTTON_右侧:
Window.alert(“鼠标右键”);
打破
案例NativeEvent.BUTTON_左:
Window.alert(“鼠标左键”);
打破
案例NativeEvent.BUTTON_中间:
违约:
break;//什么也不做
}
}
类ActivityTextCell扩展了AbstractCell


那么我遗漏了什么?如何停止浏览器从创建到鼠标单击?

您调用
super.onBrowserEvent()
,它会触发标准浏览器响应


您应该将
event.preventDefault()
移动到代码的
if
部分,将
super.onBrowserEvent()
移动到
else
部分。您希望根据浏览器事件执行其中一个,但不能同时执行这两个部分。

好吧,这当然不是几分钟的问题(从我花了一周的时间才回到这一点可以看出),但我有一个解决方案。我尝试颠倒
事件.preventDefault()
super.onBrowserEvent()
的顺序,但并没有真正起到作用

我在一个普通的网页上做了一个小实验。结果表明,MOUSEDOWN事件在该上下文中没有任何作用,并且通常的浏览器选择菜单出现在MOUSEUP上。因此,if/else逻辑似乎被搁置了

诀窍是在添加主页之后立即在顶级GUI类中包含以下内容:

RootLayoutPanel.get().addDomHandler(new ContextMenuHandler() {

    @Override
    public void onContextMenu(ContextMenuEvent event) {
        event.preventDefault();
        event.stopPropagation();
    }
}, ContextMenuEvent.getType());
这还有另外一个好处(至少就我而言),可以防止浏览器对应用程序视图中任意位置的右键单击做出反应


顺便说一句:阻止默认操作的目的是停止浏览器执行自己的操作停止传播可能不是必需的,但我还是保留了它(传播从节点一直传播到根节点,而不是相反)。重写
onBrowserEvent()的目的
是让您自己的应用程序能够处理该事件。使用
super.onBrowserEvent()
是为了首先允许您的代码处理该事件。我在之前的评论中已经给出了相关的参考。这本书是《GWT正在运行》如果你可能要做大量的GWT编码,那么这本书非常值得一读。

另外,当警报启动时,鼠标会关闭,这肯定会引起一些混乱……使用
super.onBrowserEvent()
event.preventDefault()
是我从“GWT正在运行”中得到的东西(例如,请参阅中的第3.6节),所以我怀疑这不会是错的。但是,我似乎已经将它们按相反顺序排列,所以我将尝试交换它们。至于鼠标在弹出列表显示时出现…我将不得不考虑一下。正如我所说:我是GWT的新手。没有必要怀疑任何事情。您可以在不到一分钟的时间内尝试我提出的解决方案,看看我是否它不起作用。