gpt4 book ai didi

javafx - TinyMCE从记事本(剪贴板)复制粘贴到java 1.8上的javafx WebView

转载 作者:行者123 更新时间:2023-12-04 21:37:47 35 4
gpt4 key购买 nike

我将 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 而不仅仅是纯文本的解决方案。

解决办法是基本上忽略原来的paste事件,然后使用paste插件的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;
},
...
});

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 类的实例。
JSObject window = (JSObject) webView.getEngine().executeScript("window");
window.setMember("java", new Bridge());

关于javafx - TinyMCE从记事本(剪贴板)复制粘贴到java 1.8上的javafx WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33959132/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com