我将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));
..
在编辑方面,在初始化TinyMCE编辑器时:正如您在第三次尝试中看到的那样,args.content是错误的,并且不包含剪贴板中的值。
tinymce.init {
paste_preprocess : function(plugin,args) {
debug(args.content);
第1步:[确定]
从记事本ABCDE复制的值
java系统输出剪贴板:ABCDE
编辑器html调试说:ABCDE
第2步:[确定]
从tinymce编辑器XYZQ复制的值
java system out for clipboard:XYZQ
编辑器html调试说:XYZQ
第3步:[失败]
从记事本ASDFG复制的值
java system out for clipboard: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上没有出现这种情况)必须有更好的解决方案。
答案 0 :(得分: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;
},
...
});
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());