修改JavaFX WebView中的上下文菜单

我正在尝试在用户右键单击链接时向JavaFX WebView中的上下文菜单添加一些选项,但是我无法弄清楚如何执行此操作。

我发现我可以添加自己的上下文菜单:

final ContextMenu contextMenu = new ContextMenu(); view.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler() { @Override public void handle(MouseEvent mouseEvent) { System.out.println(mouseEvent.getEventType()); if(mouseEvent.isSecondaryButtonDown()) { System.out.println("Secondary"); contextMenu.show(view, mouseEvent.getSceneX(), mouseEvent.getSceneY()); } else if (mouseEvent.isPrimaryButtonDown()) { System.out.println("Primary"); } else if (mouseEvent.isMiddleButtonDown()) { System.out.println("Middle"); } } }); javafx.scene.control.MenuItem menuItem1 = new javafx.scene.control.MenuItem("View Source"); menuItem1.setOnAction(new EventHandler() { @Override public void handle(javafx.event.ActionEvent actionEvent) { System.out.println("Link: " + rightClickURL); System.out.println("You clicked view source"); } }); contextMenu.getItems().add(menuItem1); 

不幸的是,当我这样做时,两个菜单出现:

两个上下文菜单

如果我使用view.setContextMenuEnabled(false); 然后默认菜单消失。 不幸的是,这样做也阻止我检测哪个链接被右击。 这是我正在使用的代码:

  engine.getLoadWorker().stateProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) { if (newState == Worker.State.SUCCEEDED) { EventListener listener = new EventListener() { @Override public void handleEvent(org.w3c.dom.events.Event evt) { String domEventType = evt.getType(); if (domEventType.equals(EVENT_TYPE_CLICK)) { String href = ((Element)evt.getTarget()).getAttribute("href"); } else if (domEventType.equals(EVENT_TYPE_RIGHT_CLICK)) { String href = ((Element)evt.getTarget()).getAttribute("href"); rightClickURL = href; System.out.println(href); } } }; Document doc = engine.getDocument(); NodeList nodeList = doc.getElementsByTagName("a"); for (int i = 0; i < nodeList.getLength(); i++) { ((EventTarget) nodeList.item(i)).addEventListener(EVENT_TYPE_CLICK, listener, false); ((EventTarget) nodeList.item(i)).addEventListener(EVENT_TYPE_RIGHT_CLICK, listener, false); } } } }); 

所以我的问题是: 如何访问默认的ContextMenu以便我可以自定义它? 我已经搜索了文档,但找不到任何允许您访问默认ContextMenu的方法。 似乎必须有办法做到这一点,但我很难过如何。

如果无法自定义默认的ContextMenu,是否有人知道如何在右键单击链接时显示自定义上下文菜单并捕获单击的链接? 我一直在努力实现这一点,绝对没有运气……

目前这是不可能的。 JavaFX上存在一个未解决的问题: https : //javafx-jira.kenai.com/browse/RT-20306

如果您只想添加不同的上下文菜单,那么您可以这样做

  webView.setOnMouseClicked(new EventHandler() { @Override public void handle(MouseEvent mouse) { if (mouse.getButton() == MouseButton.SECONDARY) { menu = new ContextMenu(); //add some menu items here menu.show(this, mouse.getScreenX(), mouse.getScreenY()); } else { if (menu != null) { menu.hide(); } } } });