我正在将基于 JavaScript 的 HTML 编辑器集成到 JavaFX WebView 中。(TinyMCE) 这个编辑器的特点之一是鼠标右键单击时弹出一个上下文菜单。
但是,当在 WebView 中完成此操作时,它会弹出 WebView 自己的上下文菜单。
从 2.2 版开始,有一种方法setContextMenuEnabled
可以让我禁用它。但是当我这样做时,什么都没有弹出。
我怎样才能让它正常工作?
我正在将基于 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);"
);
}
}
}
创建您自己的插件来处理右键单击并显示一个小的弹出菜单。contextmenu
查看tinymce 附带的插件的源代码。您可以为此使用它的大部分代码,并且只需要自己实现菜单点。
我能够弄清楚这一点。
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 坐标是什么。