GWT事件阻止默认在Java中不起作用

时间:2014-08-07 21:28:12

标签: java events gwt

我是GWT的新手,我需要右键点击工作。我读过的doco表明我需要覆盖onBrowserEvent()方法。我只是在这个阶段进行实验。处理事件并显示我的弹出窗口。但是,只要我关闭弹出窗口,就会出现常用的浏览器下拉菜单(包括"为此页添加书签"等等)。

我使用IceWeasel 24.5.0(Debian的FireFox克隆),显然是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
        }
    }

ActivityTextCell类扩展了AbstractCell。

那我错过了什么?如何阻止浏览器从reaticng到鼠标单击?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

嗯,这肯定不是几分钟的事情(可以看出它花了我一个星期才回到这个事实),但我有一个解决方案。我试图颠倒event.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 in Action”这本书非常值得一读。