gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:48 25 4
gpt4 key购买 nike

我试图在用户右键单击链接时向 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com