2015-11-27 31 views
5

Tôi đã nhúng trình soạn thảo tinymce nhúng vào javafx WebWiew. Tôi tải trình chỉnh sửa bằng phương thức webEngine.load. Sự cố xảy ra khi dán bản sao. Khi tôi sao chép một số nội dung từ notepad vào tinymce, nó được dán. Tiếp theo, khi tôi sao chép một số nội dung từ tinymce vào tinymce, nó được dán. Không vấn đề gì. Nhưng một khi tôi đã dán một số nội dung từ tinyme để tinymce chính nó, tôi không thể sao chép từ bên ngoài của tinymce (webView) nữa. Ví dụ khi tôi sao chép từ notepad một văn bản và thực hiện một dán, giá trị sao chép từ notepad được bỏ qua và giá trị trước đó được sao chép từ tinymce được dán lại.Dán bản sao TinyMCE từ notepad (clipboard) với javafx WebView trên java 1.8

tôi thêm người nghe để WebView và kiểm tra các giá trị vào clipboard, họ đang có trong mọi trường hợp sửa chữa:

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

Và ở phía bên biên tập viên, khi khởi tạo trình biên tập TinyMCE: Như bạn thấy lần thử thứ ba, args.content là sai và doens không chứa giá trị trong clipboard.

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

Bước 1: [OK]

giá trị sao chép từ notepad ABCDE

hệ thống java ra cho vào clipboard: ABCDE

biên tập html debug nói: ABCDE

Bước 2 : [OK]

giá trị sao chép từ biên tập TinyMCE XYZQ

hệ thống java ra cho vào clipboard: XYZQ

biên tập html debug nói: XYZQ

Bước 3: [FAIL]

giá trị sao chép từ notepad ASDFG

hệ thống java trong khay nhớ tạm thời: ASDFG

biên tập html debug nói: XYZQ

Hệ thống thuộc tính:

TinyMCE 4.2.2

Windows 7

Vấn đề xảy ra trên java 1.8.65 và 1.8.66

Sự cố không xảy ra trên java 1.7.40

Giải pháp: Tôi có thể gửi nội dung từ java tới javafx (trình chỉnh sửa) theo cách thủ công bằng cách thực thi tập lệnh v.v. và ghi đè giá trị trong hàm paste_preprocess của tinymce. Nhưng tại sao điều đó lại xảy ra? (Trường hợp không xảy ra trên java 1.7) Phải có một giải pháp tốt hơn.

Trả lời

0

Tôi đã gặp vấn đề tương tự nhưng vẫn cần một giải pháp để có thể dán HTML hoặc Word XML thành TinyMCE chứ không chỉ văn bản thuần túy.

Giải pháp về cơ bản là bỏ qua sự kiện dán ban đầu và sau đó sử dụng plugin dán pasteHtml() để chèn dữ liệu khay nhớ tạm từ Java. Lý do cho điều này là tại thời điểm mà paste_preprocess được gọi, nội dung clipboard đã được định dạng thành HTML bởi TinyMCE, do đó tôi không thể chỉ đơn giản là đặt args.content thành bất kỳ nội dung gì trong khay nhớ tạm Java.

Có tồn tại cả triển khai AWT và FX của clipboards mà tôi sử dụng cả hai. Việc triển khai FX cung cấp một số phương thức hữu ích để nhận HTML từ clipboard.

mã JavaScript đang

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

} 

đâu WebView của bạn là bạn cần phải đăng ký một thể hiện của lớp Bridge.

JSObject window = (JSObject) webView.getEngine().executeScript("window"); 
window.setMember("java", new Bridge()); 
Các vấn đề liên quan