取消控制点击上下文菜单,gwt 1.6

时间:2009-05-20 16:20:14

标签: gwt

我的gwt 1.6应用程序拦截鼠标点击超链接,因此当用户按住Shift键点击“作者”的链接时,他们会得到一个编辑...对话框,而不是导航到作者的页面。这很好用。

我现在想让用户按住Ctrl键单击以选择多个作者,但我无法弄清楚如何取消浏览器的默认弹出菜单。这段代码正确地处理了shift-clicks,但是当我在Firefox中控制点击和半失败(调用handleCtrlClick(),但我仍然得到浏览器菜单)时托管浏览器失败了:


  public void onModuleLoad() {
    Event.addNativePreviewHandler(this);
  }

  //
  // Preview events-- look for shift-clicks on paper/author links, and pops up
  // edit dialog boxes.
  // And looks for control-click to do multiple selection.
  //
  public void onPreviewNativeEvent(Event.NativePreviewEvent pe) {
    NativeEvent e = pe.getNativeEvent();
    switch (Event.getTypeInt(e.getType())) {
    case Event.ONCLICK:
      if (e.getShiftKey()) { handleShiftClick(e); }
      if (e.getCtrlKey()) { handleCtrlClick(e); }
      break;
    case Event.ONCONTEXTMENU:
      if (e.getCtrlKey()) {  // THIS IS NOT WORKING...
        e.preventDefault();
        e.stopPropagation();
      }
      break;
    }
  }

永远不会调用ONCONTEXTMENU案例中设置的断点。

2 个答案:

答案 0 :(得分:1)

IIRC ctrl + click是选择多个项目的正确方法,不是ctrl +右键单击,除非你使用的是单键鼠标(iMac),在这种情况下我无法帮助你。

您能提供更多详情吗?

修改

为什么不覆盖上下文菜单(例如禁用它)然后创建自己的上下文菜单小部件(可能基于垂直MenuBar + MenuItems)并仅在Ctrl + RightClick上显示它?

换句话说,你创建一个像这样的MouseHandler(伪代码):

public void onMouseDown(MouseDownEvent event) {
    Widget sender = (Widget) event.getSource();

    int button = event.getNativeButton();


    if (button == NativeEvent.BUTTON_LEFT) {
        if(event.is_ctrl_also)
        {
             // Add to selection
             selection = selection + sender;
        }
        else
        {
             // Lose selection and start a new one
             selection = sender;
        }
    }
    else if(button == NativeEvent.BUTTON_RIGHT) {
        if(event.is_ctrl_also)
        {
            // show context menu
            this.contextmenu.show();
        }
        else
        {
            // do something else
        }
    }

    return;
}

我没有遇到Ctrl-Leftclick触发ContextMenu事件的错误,但我确信你也可以只使用排列为Firefox做一个解决方法。

答案 1 :(得分:0)

我越来越近了:


  public void onModuleLoad() {
    Event.addNativePreviewHandler(this); // Catch shift- or control- clicks on links
    addContextMenuEventListener(RootPanel.getBodyElement());
  }

protected native void addContextMenuEventListener(Element elem) /-{ elem.oncontextmenu = function(e) { return false; // TODO: only return false if control key down... }; }-/;

这会完全禁用右键单击菜单;如果按下控制键,我真的想禁用它...