阻止/禁用JavaFX 2 WebView右键单击

时间:2012-03-28 11:32:25

标签: webview javafx javafx-2

我正在寻找一种方法来阻止/禁用javafx.scene.web.WebView中的右键单击。更具体地说,我不希望右键单击显示上下文菜单。我是这项技术的新手,无法找到方法。

7 个答案:

答案 0 :(得分:13)

仅供记录,它在JavaFX 2.2中实现。请参阅setContextMenuEnabled

的文档

答案 1 :(得分:5)

我想出了工作,但是丑陋,不优雅,我会说,党派解决方案,我不喜欢,但实际上我没有(或者只是找不到)其他出路。

它包括修改WebView的EventDispatcher。

所以我的EventDispatcher实现需要对原始WebView EventDispatcher的引用,看起来像这样:

public class MyEventDispatcher implements EventDispatcher {

private EventDispatcher originalDispatcher;

public MyEventDispatcher(EventDispatcher originalDispatcher) {
    this.originalDispatcher = originalDispatcher;
}

@Override
public Event dispatchEvent(Event event, EventDispatchChain tail) {
    if (event instanceof MouseEvent) {
        MouseEvent mouseEvent = (MouseEvent) event;
        if (MouseButton.SECONDARY == mouseEvent.getButton()) {
            mouseEvent.consume();
        }
    }
    return originalDispatcher.dispatchEvent(event, tail);
}
}

每次调度事件时,都会通过我们的调度员检查是否正确点击。如果它是我只是消耗它并继续前进。

要使其工作,您必须使用WebView:

WebView webView = new WebView();
EventDispatcher originalDispatcher = webView.getEventDispatcher();
webView.setEventDispatcher(new MyEventDispatcher(originalDispatcher));

赞赏每条评论,线索等。

答案 2 :(得分:3)

您可以使用以下css设置上下文菜单的样式。

.context-menu     { -fx-background-color: transparent; }
.menu-item        { -fx-background-color: transparent; }
.menu-item .label { -fx-text-fill: transparent; }
.menu-item:show-mnemonics .mnemonic-underline { -fx-stroke: -transparent; }

这将使所有上下文菜单和菜单项透明。我不确定您可以使用的css选择器使其仅适用于WebView上下文菜单。如果您的应用程序中没有其他菜单,那可能不是什么大问题。

答案 3 :(得分:3)

您可以使用js(jquery已使用)

来执行此操作
$(document).ready( function() { document.oncontextmenu = function() { return false } } );

答案 4 :(得分:3)

使用JavaFX 2.2+,现在可以将WebView的ContextMenuEnabled设置为false:

webView.setContextMenuEnabled(false);

WebView API Doc.

答案 5 :(得分:2)

不幸的是,这还不可能。您可能需要跟踪功能请求:http://javafx-jira.kenai.com/browse/RT-15684

答案 6 :(得分:1)

这将删除整个阶段的上下文菜单:

primaryStage.getScene().addEventFilter(MouseEvent.MOUSE_RELEASED, 
            new EventHandler<MouseEvent>() {
    public void handle(MouseEvent event) {
        if (event.getButton() == MouseButton.SECONDARY) {
            event.consume();
        }

    }
});