我在 JavaFX 中有一个应用程序,我使用
WebView
来显示特定的网页。
我需要页面上的鼠标右键不起作用;但如果我在具有
id=eventDiv
的 html 元素上使用它,它应该对它们起作用。这是 JavaFX 17。
我将 ContexMenuEnabled 设置为 false,并且没有上下文菜单,没关系。
WebView webView = new WebView();
webView.setContextMenuEnabled(false);
webView.getEngine().setJavaScriptEnabled(true);
WebEngine webEngine = webView.getEngine();
webEngine.setUserStyleSheetLocation("data:, body { background-color: #EBEBEB; }");
webEngine.setOnAlert(event -> showAlert(event.getData()));
webEngine.setConfirmHandler(message -> showConfirm(message));
System.out.println(url);
webEngine.load(url);
我使用人工智能和文档做了类似的事情,但不幸的是它不起作用。我希望当我右键单击给定的 HTML 元素(在本例中是表格单元格中的 div)时,它会打开一个自定义上下文菜单,这是在 JS 中完成的。我该怎么做才能让它发挥作用?
webView.setOnMousePressed(event -> {
if (event.isSecondaryButtonDown()) {
event.consume();
}
});
webView.getEngine().getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
if (newValue == Worker.State.SUCCEEDED) {
JSObject window = (JSObject) webView.getEngine().executeScript("window");
window.setMember("eventDiv", new EventDivHandler());
}
});
public class EventDivHandler {
public void handleEventDivClick() {
// Obsłuż PPM na elemencie z id=eventDiv
System.out.println("Kliknięto na element z id=eventDiv");
}
}
配置事件过滤器:
webView.addEventFilter(MouseEvent.MOUSE_PRESSED, event
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) {
WebView webView = new WebView();
// Load Web Page
webView.getEngine().load("https://www.wikipedia.org/");
// config event filter
webView.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
if (event.getButton() == MouseButton.SECONDARY) {
event.consume();
}
});
BorderPane root = new BorderPane();
root.setCenter(webView);
Scene scene = new Scene(root, 800, 600);
primaryStage.setTitle("Disable Right Click in WebView");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}