阻止/禁用JavaFX2 WebView右键单击

阻止/禁用JavaFX2 WebView右键单击,webview,javafx,javafx-2,Webview,Javafx,Javafx 2,我正在寻找一种在javafx.scene.web.WebView中阻止/禁用右键单击的方法。更具体地说,我不希望右键单击时显示上下文菜单。我是这项技术的新手,找不到实现这项技术的方法。不幸的是,这还不可能。有一个功能要求,你可能想跟踪:我想出了一个工作的,但丑陋的,不雅观的,我想说的,党派的解决方案,我不太喜欢,但事实上我没有(或只是找不到)其他出路 它包括修改WebView的EventDispatcher 因此,我的EventDispatcher实现需要引用原始WebView EventDis

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

不幸的是,这还不可能。有一个功能要求,你可能想跟踪:

我想出了一个工作的,但丑陋的,不雅观的,我想说的,党派的解决方案,我不太喜欢,但事实上我没有(或只是找不到)其他出路

它包括修改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 = new WebView();
EventDispatcher originalDispatcher = webView.getEventDispatcher();
webView.setEventDispatcher(new MyEventDispatcher(originalDispatcher));
每次事件被调度时,它都会通过我们的调度程序,我会检查它是否右键单击。如果是的话,我只需要消耗它,然后继续

要使其正常工作,您必须像这样使用WebView:

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 = new WebView();
EventDispatcher originalDispatcher = webView.getEventDispatcher();
webView.setEventDispatcher(new MyEventDispatcher(originalDispatcher));

每一条评论、线索等都很受欢迎。

您可以使用以下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上下文菜单。如果您的应用程序中没有其他菜单,那可能没什么大不了的。

为了记录在案,它是在JavaFX2.2中实现的。请参阅(javafx2)和(javafx8)的文档

您可以使用js(
jquery
使用)


这将删除整个阶段的关联菜单:

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

    }
});
primaryStage.getScene().addEventFilter(MouseEvent.MOUSE_发布,
新的EventHandler(){
公共无效句柄(MouseeEvent事件){
if(event.getButton()==MouseButton.SECONDARY){
event.consume();
}
}
});

使用JavaFX2.2+现在可以将WebView的ContextMenuEnabled设置为false:

webView.setContextMenuEnabled(false);

这绝对是个可怕的消息。这将添加到2.1版本中吗?至少有一种方法可以翻译这些上下文菜单吗?Jira功能现在已经在中实现并可用,并且将包含在JavaFX2.2(jdk7u6)版本中。很好。您可能还需要使用“上下文菜单”键盘按钮事件,并在Mac上按Ctrl键右键单击。在我的应用程序中,我按照您所说的做了。我阻止了所有的CTRL组合。虽然这里我只是想提出这个想法。我在2012年3月问过这个问题。只有JavaFX 2.0可用,当时没有setContextMenuEnabled方法。这是自JavaFX 2.2以来的推荐解决方案,但如果您以某种方式使用JavaFX 2.0或2.1,则必须采用下面描述的EventDispatcher方法。