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

这将是全部。