2014-09-04 30 views
3

需求是在javafx應用程序中嵌入JSON編輯器。我嘗試在webview的幫助下將json編輯器(由Ace支持)https://github.com/josdejong/jsoneditor嵌入到我的javafx應用程序中。除了複製(CTRL + C)和粘貼(CTRL + V)以外,一切正常。功能JavaFX應用程序中的未定義錯誤

經過研究,我才知道javafx webkit是safari。但我在Firefox瀏覽器,Chrome瀏覽器等所有瀏覽器中都使用過相同的編輯器。即使在safari的最新版本中,它運行良好,但是我未能在javafx webview中使用它。 目前我正在使用最新的JDK(8),所以也有最新的javafx。 有什麼辦法可以讓我的複製粘貼快捷鍵在我的嵌入式編輯器在javafx webview中工作? 請幫忙。

+0

我是jquery的新手,但我認爲,一些jquery庫可以幫助您在自定義複製粘貼實現中。 – 2014-09-04 21:30:17

回答

5

ace.js使用剪貼板,並且在任何常規瀏覽器中都能正常工作,但在JavaFX webView中,存在問題。如果您在ace.js查找功能handleClipboardData你可以看到:

  • 複製的內部工作原理,但是,當它試圖setData失敗。
  • 粘貼不起作用,因爲getData失敗。

尋找解決方法我發現這個answer與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);  
     } 
    }); 
} 

現在editor.html,你必須創建pasteContent功能將從webEngine被要求粘貼事件:

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

最後在ace.js,在函數getCopyText中,靠近第13071行,您必須插入警報,以便編輯器中的複製文本可以發送到webEngine。爲了簡單起見,請注意使用硬編碼字符串"copy: "

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

這將是所有。

+0

爆炸! 鬥牛士,男人! – Martins 2014-10-09 21:18:20

+0

而不是編輯ace getCopyText方法,更好的選擇是從ace本身接收編輯事件:editor.on('copy',handler) – 2016-10-13 10:27:26

相關問題