1

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

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

从 2.2 版开始,有一种方法setContextMenuEnabled可以让我禁用它。但是当我这样做时,什么都没有弹出。

我怎样才能让它正常工作?

4

3 回答 3

1

在 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);" 
            );
        }
    }
}
于 2019-03-02T08:36:32.750 回答
0

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

于 2013-07-31T08:04:05.743 回答
0

我能够弄清楚这一点。

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

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

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

然后可以将处理程序添加到侦听鼠标右键单击的 JavaFX WebView,然后可以从那里执行 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 坐标是什么。

于 2013-07-31T16:40:38.847 回答