2015-11-27 26 views
5

Ho incorporato editor di tinymce in javafx WebWiew. Carico l'editor con il metodo webEngine.load. I problemi si verificano su copia incolla. Quando copio alcuni contenuti dal blocco note in tinymce, viene incollato. Successivamente, quando copio del contenuto da tinymce in tinymce, viene incollato. Nessun problema. Ma una volta incollato del contenuto da tinyme a tinymce stesso, non posso più copiare all'esterno di tinymce (webView). Ad esempio, quando copio dal blocco note un testo ed eseguo una copia, il valore copiato dal blocco note viene ignorato e il valore precedente copiato da tinymce viene nuovamente incollato.TinyMCE copia incolla dal blocco note (appunti) con javafx WebView su java 1.8

ho aggiunto ascoltatore a WebView e controllare i valori degli appunti, che sono in ogni caso corretto:

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

E sul lato editore, durante l'inizializzazione l'editor TinyMCE: Come si vede al terzo tentativo, il args.content è sbagliato e le didascalie non contengono il valore negli appunti.

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

Step1: [OK]

valore copiato dalla clipboard ABCDE

Java System per appunti: ABCDE

editor HTML di debug dice: ABCDE

Step2 : [OK]

valore copiato da editor di TinyMCE XYZQ

Java System per appunti: XYZQ

editor HTML di debug dice: XYZQ

Fase 3: [FAIL]

valore copiato dalla clipboard ASDFG

java sistema per appunti: ASDFG

editor HTML di debug dice: XYZQ

Le proprietà di sistema:

TinyMCE 4.2.2

Windows 7

Il problema si verifica su Java 1.8.65 e 1.8.66

Il problema non si verifica su java 1.7.40

Soluzione: È possibile inviare manualmente il contenuto da java a javafx (editor) utilizzando gli script di esecuzione ecc. E sovrascrivere il valore nella funzione paste_preprocess di tinymce. Ma perché succede una cosa del genere? (Il caso non si verifica su java 1.7) Ci deve essere una soluzione migliore.

risposta

0

Ho avuto lo stesso problema ma avevo ancora bisogno di una soluzione per poter incollare HTML o Word XML in TinyMCE e non solo in testo normale.

La soluzione era fondamentalmente ignorare l'evento Incolla originale e quindi utilizzare il plugin di pasta pasteHtml() per inserire i dati degli Appunti da Java. La ragione di questo è che nel punto in cui viene chiamato il numero paste_preprocess, il contenuto degli appunti è già formattato in HTML da TinyMCE, quindi non posso semplicemente impostare args.content su qualsiasi cosa ci sia negli appunti Java.

Esistono sia un'implementazione AWT che FX di appunti che utilizzo entrambi. L'implementazione FX fornisce alcuni metodi utili per ottenere l'HTML dagli Appunti.

codice JavaScript codice

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

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

} 

Dove tua WebView sono è necessario registrare un'istanza della classe Bridge.

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