函数JavaFX应用程序中的未定义错误

Nid*_*eph 3 jquery json copy-paste

要求是在javafx应用程序中嵌入JSON编辑器.我尝试在webview的帮助下将json编辑器(由Ace驱动)https://github.com/josdejong/jsoneditor嵌入到我的javafx应用程序中.一切正常,除了复制(CTRL + C)和粘贴(CTRL + V).

经过研究,我发现javafx webkit是野生动物园.但是我在像firefox,chrome和所有的网页浏览器中尝试过相同的编辑器.即使在最新版本的safari中它运行良好,但我没能在javafx webview中使用它.目前我正在使用最新的JDK(8),所以也有最新的javafx.有什么方法可以让我在javafx webview中使用复制粘贴快捷键来处理嵌入式编辑器吗?请帮忙.

Jos*_*eda 6

ace.js使用剪贴板,并且在任何常规浏览器中都可以正常工作,但在JavaFX webView中,存在问题.如果你handleClipboardData在ace.js中寻找函数你可以看到:

  • 复制在内部工作,但在尝试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<String> 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);    
        }
    });
}   
Run Code Online (Sandbox Code Playgroud)

现在在editor.html中,您必须创建pasteContent将在webEngine上粘贴事件时调用的函数:

<script>
var editor = ace.edit("editor");
...
function pasteContent(content){
    editor.onPaste(content);
}
</script> 
Run Code Online (Sandbox Code Playgroud)

最后在ace.js中,在函数中getCopyText,靠近第13071行,您必须插入警报,以便编辑器中复制的文本可以发送到webEngine."copy: "为简单起见,请注意硬编码字符串的使用.

this.getCopyText = function() {
    var text = this.getSelectedText();
    javascript:alert("copy: "+text);
    this._signal("copy", text);
    return text;
};
Run Code Online (Sandbox Code Playgroud)

这将是全部.

  • 更好的选择是从 ace 本身接收编辑事件,而不是编辑 ace getCopyText 方法: editor.on('copy', handler) (2认同)