TinyMCE 在 java 1.8 上使用 javafx WebView 从记事本(剪贴板)复制粘贴

TinyMCE copy paste from notepad (clipboard) with javafx WebView on java 1.8

我将 tinymce 编辑器嵌入到 javafx WebWiew 中。我用 webEngine.load 方法加载编辑器。复制粘贴时出现问题。当我从记事本复制一些内容到tinymce时,它被粘贴了。接下来,当我将一些内容从 tinymce 复制到 tinymce 时,它​​被粘贴了。没问题。但是一旦我将一些内容从 tinyme 粘贴到 tinymce 本身,我就不能再从 tinymce(webView) 外部复制了。例如,当我从记事本复制文本并执行粘贴时,从记事本复制的值将被忽略,并再次粘贴从 tinymce 复制的先前值。

我向 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);

第一步:[确定]

从记事本 ABCDE 复制的值

java 剪贴板系统输出:ABCDE

编辑器html调试说:ABCDE

第二步:[确定]

从 tinymce 编辑器 XYZQ 复制的值

java 剪贴板系统输出:XYZQ

编辑器html调试说:XYZQ

第三步:[失败]

从记事本 ASDFG 复制的值

java 剪贴板系统输出:ASDFG

编辑器 html 调试说:XYZQ

系统属性:

TinyMCE 4.2.2

Windows 7

问题发生在 java 1.8.65 和 1.8.66

在 java 1.7.40

上没有出现该问题

解法: 我可以通过使用执行脚本等手动将内容从 java 发送到 javafx(editor) 并覆盖 tinymce 的 paste_preprocess 函数中的值。 但是为什么会发生这样的事情呢? (在java 1.7 上没有出现这种情况)必须有更好的解决方案。

我遇到了同样的问题,但仍然需要一个能够将 HTML 或 Word XML 粘贴到 TinyMCE 而不仅仅是纯文本的解决方案。

解决方案是基本上忽略原始粘贴事件,然后使用粘贴插件的 pasteHtml() 从 Java 插入剪贴板数据。这样做的原因是在调用 paste_preprocess 时,TinyMCE 已经将剪贴板内容格式化为 HTML,因此我不能简单地将 args.content 设置为 Java剪贴板。

我同时使用了剪贴板的 AWT 和 FX 实现。 FX 实现提供了一些有用的方法来从剪贴板中获取 HTML。

Java脚本代码

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

}

您的 WebView 在哪里,您需要注册一个 Bridge 实例 class。

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