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;
};
這將是所有。
我是jquery的新手,但我認爲,一些jquery庫可以幫助您在自定義複製粘貼實現中。 – 2014-09-04 21:30:17