JavaFXWebView-弹出Javascript上下文菜单

JavaFXWebView-弹出Javascript上下文菜单,java,javascript,tinymce,javafx-2,Java,Javascript,Tinymce,Javafx 2,我正在将一个基于JavaScript的HTML编辑器集成到JavaFXWebView中。(TinyMCE) 此编辑器的功能之一是在鼠标右键单击时弹出上下文菜单 但是,在WebView中完成此操作时,会弹出WebView自己的上下文菜单 从2.2版开始,有一个名为setContextMenuEnabled的方法允许我禁用它。 但当我这么做的时候,什么都不会出现 我如何才能让它正常工作?创建自己的插件,它可以处理右键单击并显示一个小的弹出菜单。 tinymce附带的contextmenu插件的sop

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

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

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


我如何才能让它正常工作?

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

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

我能够解决这个问题

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 + ")");
                    }
                }
            });
view.addEventHandler(MouseEvent.MOUSE_单击,新建EventHandler())
{
@凌驾
公共无效句柄(MouseeEvent事件)
{
if(event.getButton()==MouseButton.SECONDARY)
{
JSObject JSObject=(JSObject)engine.executeScript(TINYMCE_编辑器
+“.getContentAreaContainer().getBoundingClientRect()”;
intx=(整数)jsObject.getMember(“左”);
int y=(整数)jsObject.getMember(“top”);
y=(int)(event.getY()-y);
x=(int)(event.getX()-x);
系统输出打印ln(x+“,”+y);
如果(y>=0&&x>=0)
engine.executeScript(TINYMCE\u编辑器+”。plugins.contextmenu.\u getMenu(“+TINYMCE\u编辑器
+显示菜单(“+x+”、“+y+”);
}
}
});

代码的其余部分尝试找出正确的x,y坐标。

我能够找到这个

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 + ")");
                    }
                }
            });
view.addEventHandler(MouseEvent.MOUSE_单击,新建EventHandler())
{
@凌驾
公共无效句柄(MouseeEvent事件)
{
if(event.getButton()==MouseButton.SECONDARY)
{
JSObject JSObject=(JSObject)engine.executeScript(TINYMCE_编辑器
+“.getContentAreaContainer().getBoundingClientRect()”;
intx=(整数)jsObject.getMember(“左”);
int y=(整数)jsObject.getMember(“top”);
y=(int)(event.getY()-y);
x=(int)(event.getX()-x);
系统输出打印ln(x+“,”+y);
如果(y>=0&&x>=0)
engine.executeScript(TINYMCE\u编辑器+”。plugins.contextmenu.\u getMenu(“+TINYMCE\u编辑器
+显示菜单(“+x+”、“+y+”);
}
}
});

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

在TinyMCE 5中,
编辑器.plugins.contextmenu.\u getMenu(编辑器).showMenu(x,y)不再可用。我更新解决方案:

    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);" 
            );
        }
    }
}

在Tinymce5中,
editor.plugins.contextmenu.\u getMenu(editor).showMenu(x,y)不再可用。我更新解决方案:

    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);" 
            );
        }
    }
}

非常感谢您提供此解决方案。但是,右键单击并不总是正常工作。(例如,如果右键单击图像,它将不会显示图像菜单项)更改事件的初始化方式似乎是可行的。我已经进行了编辑。非常感谢您提供此解决方案。但是,右键单击并不总是正常工作。(例如,如果右键单击图像,它将不会显示图像菜单项)更改事件的初始化方式似乎是可行的。我已经编辑好了。