2015-11-27 6 views
5

javafx WebWiewにtinymce editorを埋め込みました。 webEngine.loadメソッドでエディタを読み込みます。コピー貼り付けに問題が発生します。私はメモ帳からいくつかのコンテンツをtinymceにコピーすると貼り付けられます。次に、私はtinymceからtinymceにいくつかのコンテンツをコピーすると、貼り付けられます。問題ない。しかし、一旦私は錫塩からそれ自身のtinymceにいくつかのコンテンツを貼り付けた後、私はtinymce(webView)の外部からはもうコピーできません。たとえば、メモ帳からテキストをコピーして貼り付けを実行すると、メモ帳からコピーされた値は無視され、tinymceからコピーされた前の値が再び貼り付けられます。TinyMCEコピー貼り付箋(クリップボード)with javafx WebView on Java 1.8

私は修正し、彼らはすべてのケースであり、WebViewのにリスナーを追加し、クリップボードの値をチェックする:

webView.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent arg0) { 
      if (arg0.isControlDown() && arg0.getCode() == KeyCode.V) { 
       final ClipBoard clipBoard = ClipBoard.getSystemClipBoard(); 
       System.out.println(clipBoard.getContent(DataFormat.PLAIN_TEXT)); 
.. 

、エディタ側では、TinyMCEのエディタを初期化中:あなたは3回目で見るように、 args.contentが間違っていて、クリップボードに値が含まれていません。

tinymce.init { 
    paste_preprocess : function(plugin,args) { 
     debug(args.content); 

ステップ1:[OK]クリップボードのためのメモ帳ABCDE

Javaシステム外からコピー

値:ABCDE

エディタHTMLのデバッグは言う:ABCDE

ステップ2 :[OK]

TinyMCEのエディタXYZQ

クリップボードのためのJavaシステム外からコピーされた値:XYZQ

エディタHTMLのデバッグは言う:XYZQ

ステップ3:メモ帳からコピーした[FAIL]

値をASDFG

エディタHTMLのデバッグは言う:XYZQ

システムプロパティ:

TinyMCEを4.2.2

のWindows 7

問題は、java 1.8.65と1.8.66で発生

Java 1.7.40で問題が発生しない

ソリューション: 実行スクリプトなどを使用してjavaからjavafx(エディタ)にコンテンツを手動で送信し、tinymceのpaste_preprocess関数の値を上書きできます。 しかし、なぜそんなことが起こるのですか? (Java 1.7ではケースが発生しません)よりよい解決策が必要です。

答えて

0

私は同じ問題を抱えていましたが、プレーンテキストだけでなく、HTMLやWord XMLをTinyMCEに貼り付けるための解決策が必要でした。

解決策は、基本的に元のペーストイベントを無視し、ペーストプラグインのpasteHtml()を使用してJavaからクリップボードデータを挿入することでした。これは、paste_preprocessが呼び出された時点で、クリップボードの内容がTinyMCEによってHTMLにフォーマットされているため、単にargs.contentをJavaクリップボードに設定することはできません。

私は両方を使用するクリップボードのAWTとFXの両方の実装があります。 FX実装は、クリップボードからHTMLを取得するための便利なメソッドを提供します。

JavaScriptコード

var regularPaste = false; 

tinyMCE.init({ 
    ... 
    paste_preprocess : function(plugin, args) { 
     if(!regularPaste) { 
     regularPaste = true; 

     var clipboardData = window.java.getClipboardData(); 

     plugin.clipboard.pasteHtml(clipboardData); // This will call paste_preprocess again 

     args.content = ""; // Ignore what TinyMCE think it should insert 
     } 

     regularPaste = false; 
    }, 
    ... 
}); 

JavaコードあなたのWebViewのは、あなたが橋クラスのインスタンスを登録する必要があり

public class Bridge { 

    public String getClipboardData() { 
    javafx.scene.input.Clipboard clipboardFx = javafx.scene.input.Clipboard.getSystemClipboard(); 
    java.awt.datatransfer.Clipboard clipboardAwt = Toolkit.getDefaultToolkit().getSystemClipboard(); 

    String data = ""; 

    try { 
     if (clipboardFx.hasHtml()) { 
     data = clipboardFx.getHtml(); 
     } else { 
     // We use the AWT clipboard if we want to retreive text because the FX implementation delivers funky characters 
     // when pasting from e.g. Command Prompt 
     data = (String) clipboardAwt.getData(DataFlavor.stringFlavor); 
     data = data.replaceAll("(\n|\r|\n\r|\r\n)", "<br />"); 
     } 
    } catch (Exception e) { 
     System.out.println("Failed getting clipboard data"); 
    } 

    return data; 
    } 

} 

JSObject window = (JSObject) webView.getEngine().executeScript("window"); 
window.setMember("java", new Bridge()); 
関連する問題