JavaFX应用程序中的函数未定义错误
要求是在javafx应用程序中嵌入JSON编辑器。 我尝试在webview的帮助下将json编辑器(由Ace驱动) https://github.com/josdejong/jsoneditor嵌入到我的javafx应用程序中。 一切正常,除了复制(CTRL + C)和粘贴(CTRL + V)。
经过研究,我发现javafx webkit是safari 。 但是我在像Firefox,Chrome和所有的网页浏览器中尝试了相同的编辑器。 即使在最新版本的safari中它运行良好,但我没能在javafx webview中使用它。 目前我正在使用最新的JDK(8),所以也有最新的javafx。 有什么方法可以让我在javafx webview中使用复制粘贴快捷键来处理嵌入式编辑器吗? 请帮忙。
ace.js使用剪贴板,并且在任何常规浏览器中它都可以正常工作,但在JavaFX webView中,存在问题。 如果你在ace.js中查找函数handleClipboardData
,你可以看到:
- 复制在内部工作,但当它尝试
setData
时失败。 - 粘贴不起作用,因为
getData
失败。
寻找解决方法我发现这个答案与codemirror相关,也可以应用于ace.js。
基本上,您必须在JavaFX应用程序(在ace编辑器之外)中建立桥接来处理复制和粘贴事件。 像这样的东西:
@Override public void start(Stage primaryStage) { webView=new WebView(); webEngine = webView.getEngine(); webEngine.load(Utils.class.getResource("editor.html").toExternalForm()); // Capture Ctrl+V event and process it webView.addEventHandler(KeyEvent.KEY_PRESSED, keyEvent -> { if (keyEvent.isControlDown() && keyEvent.getCode() == KeyCode.V){ // PASTE final Clipboard clipboard = Clipboard.getSystemClipboard(); String content = (String) clipboard.getContent(DataFormat.PLAIN_TEXT); webEngine.executeScript(" pasteContent(\""+content+"\") "); } }); // retrieve copy event via javascript:alert webEngine.setOnAlert((WebEvent we) -> { if(we.getData()!=null && we.getData().startsWith("copy: ")){ // COPY final Clipboard clipboard = Clipboard.getSystemClipboard(); final ClipboardContent content = new ClipboardContent(); content.putString(we.getData().substring(6)); clipboard.setContent(content); } }); }
现在在editor.html中,您必须创建pasteContent
函数,该函数将在粘贴事件上从webEngine调用:
最后在ace.js中,在函数getCopyText
,靠近第13071行,您必须插入警报,以便编辑器中复制的文本可以发送到webEngine。 为简单起见,请注意使用硬编码字符串"copy: "
。
this.getCopyText = function() { var text = this.getSelectedText(); javascript:alert("copy: "+text); this._signal("copy", text); return text; };
这将是全部。