我的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案例中设置的断点。
答案 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... }; }-/;