JavaFXWebView-弹出Javascript上下文菜单

JavaFX WebView - Popping up Javascript context menu

本文关键字:菜单 上下文 Javascript 弹出 JavaFXWebView-      更新时间:2023-09-26

我正在将基于JavaScript的HTML编辑器集成到JavaFX WebView中。(TinyMCE)这个编辑器的一个功能是当鼠标右键点击时弹出一个上下文菜单。

但是,当在WebView中执行此操作时,它会弹出WebView自己的上下文菜单。

从版本2.2开始,有一个名为setContextMenuEnabled的方法允许我禁用它。但当我这样做的时候,什么都不会弹出。

如何使其正确工作?

在TinyMCE 5中,editor.plugins.contextmenu._getMenu(editor).showMenu(x,y);不再可用。我更新Avrom解决方案:

    webView = new WebView( );
    webView.setContextMenuEnabled( false );
    webView.addEventHandler( MouseEvent.MOUSE_CLICKED, this::onMouseClicked );
...
    private void onMouseClicked( MouseEvent event ) {
    WebEngine engine = webView.getEngine( );
    if( event.getButton( ) == MouseButton.SECONDARY ) {
        JSObject clientRect = ( JSObject )engine.executeScript( 
            "tinymce.activeEditor.getContentAreaContainer().getBoundingClientRect()" 
        );
        int x = ( Integer )clientRect.getMember( "left" );
        int y = ( Integer )clientRect.getMember( "top" );
        y = ( int )( event.getY( ) - y );
        x = ( int )( event.getX( ) - x );
        if( y >= 0 && x >= 0 ) {
            engine.executeScript( 
                "tinymce.activeEditor.fire('contextmenu', { bubbles: true, cancelable: true, view: window, buttons: 2, "
                        + "clientX: " + x + ", clientY: " + y + " }, true);" 
            );
        }
    }
}

创建自己的插件,处理右键单击并显示一个小的弹出菜单。请参阅tinymce附带的contextmenu插件的源代码。您可以使用它的大部分代码,只需要自己实现菜单点。

我能够弄清楚这一点。

TinyMCE可以使用以下JavaScript弹出上下文菜单:

editor.plugins.contextmenu._getMenu(editor).showMenu(x,y);

其中editor是对给定TinyMCE编辑器(例如tinymce.currentEditor)的引用,x,y是相对于内容区域的坐标。

然后可以在JavaFXWebView中添加一个处理程序,用于监听鼠标右键单击,然后可以从那里执行javascript。

view.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
            {
                @Override
                public void handle(MouseEvent event)
                {
                    if (event.getButton() == MouseButton.SECONDARY)
                    {
                        JSObject jsObject = (JSObject) engine.executeScript(TINYMCE_EDITOR
                                + ".getContentAreaContainer().getBoundingClientRect()");
                        int x = (Integer) jsObject.getMember("left");
                        int y = (Integer) jsObject.getMember("top");
                        y = (int) (event.getY() - y);
                        x = (int) (event.getX() - x);
                        System.out.println(x + ", " + y);
                        if (y >= 0 && x >= 0)
                            engine.executeScript(TINYMCE_EDITOR + ".plugins.contextmenu._getMenu(" + TINYMCE_EDITOR
                                    + ").showMenu(" + x + "," + y + ")");
                    }
                }
            });

代码的其余部分试图找出正确的x,y坐标是什么。