ace.js는 클립 보드를 사용하며 모든 일반 브라우저에서 제대로 작동하지만 JavaFX webView 내부에는 문제가 있습니다.
- 복사 내부적으로 작동하지만,이
setData
하려고하면 실패합니다 : 당신이 ace.js에서 함수 handleClipboardData
찾는 경우에 당신은 그것을 볼 수 있습니다.
getData
이 실패하여 붙여 넣기가 작동하지 않습니다.
나는이 answer을 codemirror와 관련이 있으며 ace.js에도 적용 할 수있는 대안을 찾고 있습니다.
기본적으로 복사 및 붙여 넣기 이벤트를 처리하려면 JavaFX 응용 프로그램 (에이스 편집기 외부)에서 브리지를 만들어야합니다. 이런 식으로 뭔가 :
@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, 당신은 paste 이벤트에 webEngine에서 호출 될 pasteContent
기능을 만들 수 있습니다
<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 라이브러리는 사용자 정의 사본 붙여 넣기 구현에서 도움이 될 것이라고 생각합니다. –