2015-08-26 2 views
3

Я разрабатываю небольшое приложение JavaFX. Я хотел бы включить редактор Lua. Я использую редактор ACE в своем приложении через узел WebView. Редактор отлично загружается; однако я не могу вставлять текст через события мыши и события клавиатуры, независимо от того, где был скопирован текст. Это известная ошибка?Не удается вставить в редактор ACE на JavaFX WebView

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 фрагмент кода:

@FXML 
private WebView scriptEditor; 

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

Проверьте это Http: // stackove rflow.com/a/25676561/3956070 –

+0

О, хорошо спасибо! Я сделаю это. – DracoStriker

ответ

5

С Хосе Передом предложением, я смог вставить текст с помощью ключевых событий с помощью Ctrl + v. Но я не мог вставить с помощью мыши щелчок Copy/Cut/Paste.

Я смог полностью решить свою проблему, создав коммуникационный мост от Javascript к java. Я вызываю java-метод в событии вставки в редакторе ACE.

Java фрагмент кода:

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