java - 修改 JavaFX WebView 中的上下文菜单

标签 java webview javafx

我试图在用户右键单击链接时向 JavaFX WebView 的上下文菜单添加一些选项,但我不知道该怎么做。

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

            final ContextMenu contextMenu = new ContextMenu();
            view.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
                @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<javafx.event.ActionEvent>() {
                @Override
                public void handle(javafx.event.ActionEvent actionEvent) {
                    System.out.println("Link: " + rightClickURL);
                    System.out.println("You clicked view source");
                }
            });

            contextMenu.getItems().add(menuItem1);

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

Two Context Menus

如果我使用 view.setContextMenuEnabled(false); 那么默认菜单就会消失。不幸的是,这样做也使我无法检测到右键单击了哪个链接。这是我为此使用的代码:

            engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
                @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 的方法。似乎必须有办法做到这一点,但我不知道该怎么做。

如果无法自定义默认的上下文菜单,有谁知道我如何在右键单击链接时显示自定义上下文菜单并捕获单击了哪个链接?几天来我一直在努力实现这一目标,但绝对没有运气......

最佳答案

目前这是不可能的。 JavaFX 上有一个 Unresolved 问题: https://javafx-jira.kenai.com/browse/RT-20306

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

 webView.setOnMouseClicked(new EventHandler<MouseEvent>() {

                @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();
                        }
                    }
                }
            });

关于java - 修改 JavaFX WebView 中的上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19150440/

相关文章:

Javafx - 将项目添加到与另一个类文件夹不同的类文件夹中的可观察列表的正确方法是什么

java - 我如何知道/感觉到多线程对我的程序有帮助

Android webview loadDataWithBaseURL 如何从 Assets 加载图像?

javascript - 如何在 Android 应用程序的 WebView 中查看 Javascript 错误?

android - webview 占据整个屏幕,覆盖工具栏

java - 计算按下按钮到执行一行代码之间的延迟的方法

JavaFX 模块化应用程序,未找到 java.lang.module.FindException : Module javafx. 控件(Java 11、Intellij)

java - 如何调用Asynctask中的Mainactivity方法进行后台工作?

java - 保存hashmap结构java

java - 我如何使用java中的html解析器从DIV中获取数据