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

ben*_*ser 5 clipboard javafx tinymce copy paste

我将tinymce编辑器嵌入到javafx WebWiew中.我用webEngine.load方法加载编辑器.复制粘贴出现问题.当我将记事本中的一些内容复制到tinymce时,它会被粘贴.接下来,当我将一些内容从tinymce复制到tinymce时,它会被粘贴.没问题.但是,一旦我将一些来自tinyme的内容粘贴到了自己的内容中,我就无法再从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));
..
Run Code Online (Sandbox Code Playgroud)

在编辑器方面,在初始化TinyMCE编辑器时:正如您在第三次尝试中看到的那样,args.content是错误的,并且不包含剪贴板中的值.

tinymce.init {
    paste_preprocess : function(plugin,args) {
       debug(args.content);
Run Code Online (Sandbox Code Playgroud)

第1步:[确定]

从记事本ABCDE复制的值

用于剪贴板的java系统:ABCDE

编辑器html调试说:ABCDE

第2步:[确定]

从tinymce编辑器XYZQ复制的值

用于剪贴板的java系统:XYZQ

编辑器html调试说:XYZQ

第3步:[失败]

从记事本ASDFG复制的值

用于剪贴板的java系统:ASDFG

编辑器html调试说:XYZQ

系统属性:

TinyMCE 4.2.2

Windows 7的

问题出现在java 1.8.65和1.8.66上

java 1.7.40上不会出现此问题

解决方案: 我可以使用执行脚本等手动将内容从java发送到javafx(编辑器),并覆盖tinymce的paste_preprocess函数中的值.但为什么会发生这种事情?(java 1.7上没有出现这种情况)必须有一个更好的解决方案.

Cle*_*nUp 1

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

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

剪贴板有 AWT 和 FX 实现,我都使用它们。FX 实现提供了一些从剪贴板获取 HTML 的有用方法。

JavaScript 代码

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;
    },
  ...
});
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

在 WebView 所在的位置,您需要注册 Bridge 类的实例。

JSObject window = (JSObject) webView.getEngine().executeScript("window");
window.setMember("java", new Bridge());
Run Code Online (Sandbox Code Playgroud)