我是GWT的新手,我需要单击鼠标右键。我读过的文档表明我需要重写onBrowserEvent()方法。我只是在这个阶段进行实验。事件已处理,出现我的弹出窗口。但是,一旦我关闭弹出窗口,就会出现通常的浏览器下拉菜单(带有诸如“为此页面添加书签”之类的选项)。

我正在使用IceWeasel 24.5.0(Debian的FireFox克隆),显然是Debian(乳白的)。

以下是相关代码:

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。

那我想念什么呢?如何阻止浏览器停止点击鼠标?

最佳答案

好吧,这当然不是几分钟的事情(事实证明,我花了一个星期才回到这个事实),但是我有一个解决方案。我试图反转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”非常值得一读。

08-03 18:10
查看更多