JavaFXWebView-弹出Javascript上下文菜单
我正在将一个基于JavaScript的HTML编辑器集成到JavaFXWebView中。(TinyMCE) 此编辑器的功能之一是在鼠标右键单击时弹出上下文菜单 但是,在WebView中完成此操作时,会弹出WebView自己的上下文菜单 从2.2版开始,有一个名为JavaFXWebView-弹出Javascript上下文菜单,java,javascript,tinymce,javafx-2,Java,Javascript,Tinymce,Javafx 2,我正在将一个基于JavaScript的HTML编辑器集成到JavaFXWebView中。(TinyMCE) 此编辑器的功能之一是在鼠标右键单击时弹出上下文菜单 但是,在WebView中完成此操作时,会弹出WebView自己的上下文菜单 从2.2版开始,有一个名为setContextMenuEnabled的方法允许我禁用它。 但当我这么做的时候,什么都不会出现 我如何才能让它正常工作?创建自己的插件,它可以处理右键单击并显示一个小的弹出菜单。 tinymce附带的contextmenu插件的sop
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);"
);
}
}
}
非常感谢您提供此解决方案。但是,右键单击并不总是正常工作。(例如,如果右键单击图像,它将不会显示图像菜单项)更改事件的初始化方式似乎是可行的。我已经进行了编辑。非常感谢您提供此解决方案。但是,右键单击并不总是正常工作。(例如,如果右键单击图像,它将不会显示图像菜单项)更改事件的初始化方式似乎是可行的。我已经编辑好了。