【问题标题】:Cannot paste into ACE editor on JavaFX WebView无法粘贴到 JavaFX WebView 上的 ACE 编辑器
【发布时间】:2015-08-26 00:10:27
【问题描述】:

我正在开发一个小型 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 代码 sn-p:

@FXML
private WebView scriptEditor;

private void initializeCardScript() {
    scriptEditor.getEngine().load("path to HTML file");
}

【问题讨论】:

标签: webview javafx-8 clipboard paste ace-editor


【解决方案1】:

在 José Pereda 的建议下,我可以使用 ctrl+v 通过关键事件粘贴文本。但是我不能用鼠标点击复制/剪切/粘贴对话框粘贴。

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

Java 代码 sn-p:

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

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多