GWT を使用して AJAX Web アプリを作成しています。デスクトップ アプリのように、さまざまなことに右クリックを使用したいと考えています。ただし、右クリックすると標準の Web コンテキスト メニューが生成され、void onClick(ClickEvent イベント) が呼び出されることはありません。誰もこれを機能させる方法を考え出しましたか? ありがとう!
3 に答える
ユーザーが右クリックした場所に基づいてウィジェットを表示する 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;">
を拡張することでできることがわかりましたDeckPanel
。これは、優れた議論と、それが機能することを証明する素晴らしいデモです。
http://whatwouldnickdo.com/wordpress/370/gwt-right-click-context-menu/
それを行う方法はいくつかありますが、GWTチームはこれについて議論し、Webアプリで右クリックを有効にすることは悪いことであると判断したため、サポートしないという意識的な決定を下しました。議論は、右クリックは期待どおりに機能し続ける必要があり(ホストブラウザの右クリックコンテキストメニューを表示する)、これをオーバーライドすると、期待される動作とそれが破られ、悪い習慣になるというものでした。右クリックのコンテキストメニューが一般的に役立つ場合がありますが、GWTチームの決定に同意する傾向があります。