代码之家  ›  专栏  ›  技术社区  ›  DracoStriker

无法粘贴到JavaFX WebView上的ACE编辑器

  •  3
  • DracoStriker  · 技术社区  · 9 年前

    我正在开发一个小型JavaFX应用程序。我想嵌入一个Lua编辑器。我正在通过WebView节点在应用程序中使用ACE编辑器。编辑器加载完美;但是,我不能通过鼠标事件和键盘事件粘贴任何文本,无论文本是从哪里复制的。这是已知的错误吗?

    HTML文件:

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <title>Lua Editor</title>
            <style type="text/css" media="screen">
                #editor { 
                    position: absolute;
                    top: 0;
                    right: 0;
                    bottom: 0;
                    left: 0;
                }
            </style>
        </head>
        <body>
            <div id="editor"></div>
            <script src="ace.js" type="text/javascript" charset="utf-8"></script>
            <script>
                var editor = ace.edit("editor");
                editor.getSession().setMode("ace/mode/lua");
                editor.setOptions({
                    fontSize: "11pt"
                });
            </script>
        </body>
    </html>
    

    Java代码段:

    @FXML
    private WebView scriptEditor;
    
    private void initializeCardScript() {
        scriptEditor.getEngine().load("path to HTML file");
    }
    
    1 回复  |  直到 9 年前
        1
  •  5
  •   DracoStriker    9 年前

    根据Jos Pereda的建议,我可以使用ctrl+v在关键事件中粘贴文本。但我无法使用鼠标单击“复制/剪切/粘贴”对话框进行粘贴。

    通过创建一个从Javascript到java的通信桥梁,我完全解决了我的问题。我在ACE编辑器中对粘贴事件调用一个java方法。

    Java代码段:

    private void initializeCardScript() {
        scriptEditor.getEngine().load("path to HTML file");
        ((JSObject) scriptEditor.getEngine().executeScript("window")).setMember("java", new Object() {
            public void paste() {
                String content = (String) Clipboard.getSystemClipboard().getContent(DataFormat.PLAIN_TEXT);
                if (content != null) {
                    scriptEditor.getEngine().executeScript("editor.onPaste(\"" + content.replace("\n", "\\n") + "\");");
                }
            }
        });
    }
    

    ace.js:

    var onPaste = function(e) {
        java.paste();
    //  var data = handleClipboardData(e);
    //  if (typeof data == "string") {
    //      if (data)
    //          host.onPaste(data, e);
    //      if (useragent.isIE)
    //          setTimeout(resetSelection);
    //      event.preventDefault(e);
    //  }
    //      else {
    //          text.value = "";
    //          pasted = true;
    //      }
    };
    

    来源:

    https://stackoverflow.com/a/25676561/3956070

    https://blogs.oracle.com/javafx/entry/communicating_between_javascript_and_javafx