JavaFX WebView上下文菜单 [英] JavaFX WebView Context Menu

查看:219
本文介绍了JavaFX WebView上下文菜单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用FXCanvas在SWT应用程序内部使用JavaFX WebView / WebEngine实现一个简单的浏览器。由于某种原因,内置的上下文菜单(使用刷新复制/粘贴等)似乎不起作用。

I am trying to implement a simple browser using the JavaFX WebView/WebEngine inside of an SWT application using the FXCanvas. For some reason, the inbuilt context menu (with things like Refresh Copy/Paste etc.) does not seem to be working.

如果我创建自己的JavaFX上下文菜单然后它可以工作,但我找不到一种方法来确定给定点下鼠标下的HTML元素(即

If I create my own JavaFX context menu then it works, but I can't find a way to determine what HTML element is under the mouse at a given point (i.e. to have different menu items for links vs. images)

一个显示此行为的简单示例:

A simple example that shows this behavior:

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import javafx.embed.swt.FXCanvas;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

public class TestBrowser {
    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell(display);

        shell.setLayout(new GridLayout());

        FXCanvas canvas = new FXCanvas(shell, SWT.NONE);
        canvas.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true));

        BorderPane borderPane = new BorderPane();
        Scene scene = new Scene(borderPane);
        canvas.setScene(scene);

        WebView browser = new WebView();
        WebEngine webEngine = browser.getEngine();
        borderPane.setCenter(browser);

//        createContextMenu(browser); Creating a custom context menu works

        boolean test = browser.isContextMenuEnabled();
        System.out.println("WebView context menu enabled? "+test);

        webEngine.load("http://example.org");

        shell.open ();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
        display.dispose ();
    }

    private static void createContextMenu(WebView webView) {
        ContextMenu contextMenu = new ContextMenu();
        MenuItem reload = new MenuItem("Reload");
        reload.setOnAction(e -> webView.getEngine().reload());

        webView.setOnMousePressed(e -> {
            if (e.getButton() == MouseButton.SECONDARY) {
                contextMenu.show(webView, e.getScreenX(), e.getScreenY());
            } else {
                contextMenu.hide();
            }
        });
    }
}

我做错了什么,或者这是一个错误使用FXCanvas / WebView?

Am I doing something wrong, or is this a bug with FXCanvas/WebView?

推荐答案

只需使用JavaFx中的JSObject来获取所选的html元素....

Just use JSObject from JavaFx to get the selected html element....

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import javafx.embed.swt.FXCanvas;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import netscape.javascript.JSObject;

public class TestBrowser {
    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell(display);

        shell.setLayout(new GridLayout());

        FXCanvas canvas = new FXCanvas(shell, SWT.NONE);
        canvas.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true));

        BorderPane borderPane = new BorderPane();
        Scene scene = new Scene(borderPane);
        canvas.setScene(scene);

        WebView browser = new WebView();
        WebEngine webEngine = browser.getEngine();
        borderPane.setCenter(browser);

        createContextMenu(browser); //Creating a custom context menu works

        boolean test = browser.isContextMenuEnabled();
        System.out.println("WebView context menu enabled? "+test);

        webEngine.load("http://example.org");

        shell.open ();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
        display.dispose ();
    }



    private static void createContextMenu(WebView webView) {

        MenuItem reload = new MenuItem("reload");
        reload.setOnAction(e -> {
            webView.getEngine().reload();
            }
        );
        ContextMenu contextMenu = new ContextMenu(reload);
        webView.setOnMousePressed(e -> {
            if (e.getButton() == MouseButton.SECONDARY) {
                System.out.println( webView.getEngine().executeScript("document.elementFromPoint("
                        +e.getX()
                        +"," +  e.getY()+").tagName;"));
                JSObject object = (JSObject) webView.getEngine().executeScript("document.elementFromPoint("
                        +e.getX()
                        +"," +  e.getY()+");");
                contextMenu.show(webView, e.getScreenX(), e.getScreenY());
            } else {
                contextMenu.hide();
            }
        });
    }
}

这篇关于JavaFX WebView上下文菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆