我正在使用GWT构建一个AJAX Web应用程序,我想使用右键单击各种内容,就像在桌面应用程序中一样。但是,右键单击会生成标准Web上下文菜单,并且永远不会调用void onClick(ClickEvent事件)。有没有人想出如何让这个工作?谢谢!
答案 0 :(得分:7)
轻松,在contextmenuhandler上添加一个监听器,它将根据用户右键单击的位置显示一个小部件。 https://confluence.clazzes.org/pages/viewpage.action?pageId=425996
class MyWidget extends Composite implements ContextMenuHandler {
// just an example, use a meaningful Widget here...
private Widget base;
private PopupPanel contextMenu;
public MyWidget() {
// initialize base widget, etc...
this.contextMenu = new PopupPanel(true);
this.contextMenu.add(new HTML("My Context menu!"));
this.contextMenu.hide();
initWidget(this.base);
// of course it would be better if base would implement HasContextMenuHandlers, but the effect is the same
addDomHandler(this, ContextMenuEvent.getType());
}
public void onContextMenu(ContextMenuEvent event) {
// stop the browser from opening the context menu
event.preventDefault();
event.stopPropagation();
this.contextMenu.setPopupPosition(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY());
this.contextMenu.show();
}
}
最后,您需要禁用浏览器菜单以完全重载此类上下文菜单。除了opera之外,这应该适用于所有浏览器。但老实说,这些天新手使用的是^ _______ ^
<body oncontextmenu="return false;">
答案 1 :(得分:4)
事实证明,您可以通过扩展DeckPanel
来实现这一目标。这是一个很好的讨论,以及证明它有效的漂亮演示。
http://whatwouldnickdo.com/wordpress/370/gwt-right-click-context-menu/
答案 2 :(得分:2)
尽管有很多方法可以做到这一点我相信GWT团队对此有争议,并决定在网络应用程序中启用右键是一件坏事,因此做出了不支持它的有力决定。争论的焦点是右键单击应该继续按预期工作(调出主机浏览器的右键单击上下文菜单)并覆盖它会打破预期的行为,这将是不好的做法。虽然我有一个右键上下文菜单有用的实例,但我倾向于同意GWT团队的决定。