2015-11-27 17 views
5

मैं JavaFX WebWiew में TinyMCE संपादक एम्बेडेड पर JavaFX WebView साथ नोटपैड (क्लिपबोर्ड) से कॉपी पेस्ट करें। मैं webEngine.load विधि के साथ संपादक लोड। कॉपी पेस्ट पर समस्याएं होती हैं। जब मैं नोटपैड से टिनिमस में कुछ सामग्री कॉपी करता हूं, तो इसे चिपकाया जाता है। इसके बाद, जब मैं TinyMCE में TinyMCE से कुछ सामग्री की प्रतिलिपि, यह चिपकाया जाता है। कोई बात नहीं। लेकिन एक बार मैं tinyme ही TinyMCE के लिए से कुछ सामग्री चिपकाया है, मैं अब और TinyMCE (WebView) के बाहर से नकल नहीं कर सकते। उदाहरण के लिए जब मैं नोटपैड से एक पाठ को कॉपी और पेस्ट करते हैं, नोटपैड से नकल मूल्य नजरअंदाज कर दिया है और पिछले मान TinyMCE से नकल फिर से चिपकाया जाता है।TinyMCE जावा 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 संपादक को प्रारंभ करते हुए: आप तीसरे प्रयास में देखने के रूप में, args.content गलत है और क्लिपबोर्ड में मान नहीं है।

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

Step1: [ठीक]

मूल्य नोटपैड ABCDE से क्लिपबोर्ड के लिए बाहर की नकल की

जावा प्रणाली: ABCDE

संपादक एचटीएमएल डिबग का कहना है: ABCDE

चरण 2 : [ठीक]

मूल्य TinyMCE संपादक XYZQ से क्लिपबोर्ड के लिए बाहर की नकल की

जावा प्रणाली: XYZQ

संपादक एचटीएमएल डिबग का कहना है: XYZQ

चरण 3: [असफल]

मूल्य नोटपैड ASDFG से नकल

क्लिपबोर्ड के लिए जावा सिस्टम आउट: ASDFG

संपादक एचटीएमएल डिबग का कहना है: XYZQ

प्रणाली गुण:

TinyMCE 4.2.2

विंडोज 7

समस्या जावा 1.8.65 और 1.8.66 पर होता है

समस्या जावा पर नहीं होती है 1.7.40

समाधान: मैं मैन्युअल रूप से जावा से javafx (संपादक) को सामग्री स्क्रिप्ट आदि का उपयोग करके सामग्री भेज सकता हूं और tinymce के paste_preprocess फ़ंक्शन में मान को ओवरराइड कर सकता हूं। लेकिन क्यों इस तरह बात क्या होता है? (जावा 1.7 पर मामला नहीं होता है) एक बेहतर समाधान होना चाहिए।

उत्तर

0

मैं एक ही समस्या थी, लेकिन अभी भी और न सिर्फ सादा पाठ TinyMCE में HTML या वर्ड एक्सएमएल पेस्ट करने में सक्षम होने के लिए एक समाधान की जरूरत है।

समाधान मूल रूप से मूल पेस्ट घटना की अनदेखी करने के लिए और फिर पेस्ट प्लगइन के pasteHtml() जावा से क्लिपबोर्ड डेटा सम्मिलित करने के लिए उपयोग किया गया था। इस का कारण इस प्रकार मैं बस जो कुछ भी जावा क्लिपबोर्ड में है args.content निर्धारित नहीं कर सकते, उस बिंदु जहां paste_preprocess कहा जाता है पर, क्लिपबोर्ड सामग्री को पहले से ही HTML के लिए TinyMCE से स्वरूपित किया गया है है।

जो मैं दोनों का उपयोग clipboards के AWT और FX कार्यान्वयन दोनों मौजूद हैं। एफएक्स कार्यान्वयन क्लिपबोर्ड से एचटीएमएल प्राप्त करने के लिए कुछ उपयोगी तरीकों को प्रदान करता है।

जावा स्क्रिप्ट कोड

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

जावा कोड

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

} 

जहाँ आपके WebView आप ब्रिज वर्ग का एक उदाहरण रजिस्टर करने की आवश्यकता है।

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