2015-11-27 4 views
5

Ich eingebettete Tinymce Editor in Javafx WebWiew. Ich lade den Editor mit der Methode webEngine.load. Probleme treten beim Kopieren einfügen auf. Wenn ich einen Inhalt aus dem Editor in tinymce kopiere, wird er eingefügt. Als nächstes, wenn ich etwas Inhalt von Tinymce in Tinymce kopiere, wird es eingefügt. Kein Problem. Aber sobald ich etwas Inhalt von tinyme zu tinymce selbst eingefügt habe, kann ich nicht mehr von außerhalb von Tinymce (webView) kopieren. Zum Beispiel, wenn ich aus dem Editor einen Text kopiere und einen Einfügevorgang ausführe, wird der aus dem Editor kopierte Wert ignoriert und der vorher von ynymce kopierte Wert wird wieder eingefügt.TinyMCE kopieren einfügen aus dem Editor (Zwischenablage) mit Javafx WebView auf Java 1.8

habe ich Zuhörer webView und überprüfte die Zwischenablage Werte, sie sind in allen Fällen korrigieren:

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)); 
.. 

Und auf der Editor Seite, während die TinyMCE Editor initialisiert: Wie Sie auf dem dritten Versuch zu sehen, die args.content ist falsch und enthält den Wert in der Zwischenablage nicht.

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

Schritt 1: [OK]

Wert von Notizblock ABCDE kopiert

Java-System für die Zwischenablage aus: ABCDE

Editor html Debug sagt: ABCDE

Schritt 2 : [OK]

Wert von tinymce Editor XYZQ kopiert

Java-System für die Zwischenablage aus: XYZQ

Editor html Debug sagt: XYZQ

Schritt 3: [FAIL]

Wert von Notizblock ASDFG kopiert

Java-System für die Zwischenablage: ASDFG

Editor html Debug sagt: XYZQ

Die Systemeigenschaften:

TinyMCE 4.2.2

Windows 7

Das Problem tritt auf Java 1.8.65 und 1.8.66

Das Problem tritt nicht auf Java 1.7.40

Lösung: Ich kann Inhalt von Java zu javafx (Herausgeber) manuell schicken, indem ich ausführende Skripte usw. verwendete und den Wert in der paste_preprocess Funktion von tinymce überschreibe. Aber warum so etwas passiert? (Fall tritt nicht auf Java 1.7 auf) Es muss eine bessere Lösung geben.

Antwort

0

Ich hatte das gleiche Problem, aber immer noch eine Lösung für das Einfügen von HTML oder Word XML in TinyMCE und nicht nur Text benötigt.

Die Lösung bestand darin, das ursprüngliche Einfügeereignis grundsätzlich zu ignorieren und dann mit dem Einfügen-Plugin pasteHtml() Zwischenablagedaten aus Java einzufügen. Der Grund dafür ist, dass an der Stelle, an der paste_preprocess aufgerufen wird, der Inhalt der Zwischenablage bereits von TinyMCE in HTML formatiert ist. Daher kann ich args.content nicht einfach auf das setzen, was in der Java-Zwischenablage ist.

Es gibt sowohl eine AWT- als auch eine FX-Implementierung von Zwischenablagen, die ich beide verwende. Die FX-Implementierung bietet einige nützliche Methoden zum Abrufen von HTML aus der Zwischenablage.

JavaScript-Code

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-Code

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; 
    } 

} 

Wo Ihre WebView sind Sie müssen eine Instanz der Brückenklasse registrieren.

JSObject window = (JSObject) webView.getEngine().executeScript("window"); 
window.setMember("java", new Bridge()); 
Verwandte Themen