gpt4 book ai didi

Java 在同一程序的两个运行副本之间复制/粘贴 org.w3c.dom.Node

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:19:42 26 4
gpt4 key购买 nike

我有一个程序可以显示 XML 文件的树形表示。使用许多在线资源,我在程序运行的单个实例中复制/粘贴。我正在使用系统剪贴板。我需要的是能够从程序的一个实例复制节点并粘贴到同一程序的不同实例。

我尝试了很多不同的选项,但结果都是一样的。从同一应用程序中粘贴时,clipboardContent 包含一个“可传输”对象,其中包含正确的数据以及一个设置为“true”的 isLocal。当我执行复制然后尝试从运行 clipboardContent 的同一程序的另一个实例进行粘贴时,clipboardContent 包含一个“flavorsToData”HashMap 和“flavors”值,对 isDataFlavorSupported 的检查失败(永远不会命中代表新 flavor 的自定义类)。

我曾尝试在 getContents() 调用中为请求者对象使用不同的值。同样,我为 setContent() 调用尝试了几种不同的 ClipboardOwners。两者似乎都没有以任何方式改变行为。

我非常想将正在复制的节点转换回文本 XML 格式,然后在粘贴时转换回 DOM 模型,但如果可能的话我宁愿不这样做。

这个类用来定义DataFlavor和transferable对象:

import java.awt.datatransfer.*; import org.w3c.dom.Node;

public class NodeCopyPaste implements Transferable {

static public DataFlavor NodeFlavor;
private DataFlavor [] supportedFlavors = {NodeFlavor};
public Node aNode;

public NodeCopyPaste (Node paraNode) {
aNode = paraNode;
try {
NodeFlavor = new DataFlavor (Class.forName ("org.w3c.dom.Node"), "Node");
}
catch (ClassNotFoundException e) {
e.printStackTrace ();
}
}

public synchronized DataFlavor [] getTransferDataFlavors () {
return (supportedFlavors);
}

public boolean isDataFlavorSupported (DataFlavor nodeFlavor) {
return (nodeFlavor.equals (NodeFlavor));
}

public synchronized Object getTransferData (DataFlavor nFlavor) throws UnsupportedFlavorException {
if (nFlavor.equals (NodeFlavor))
return (this);
else
throw new UnsupportedFlavorException (nFlavor);
}

public void lostOwnership (Clipboard parClipboard, Transferable parTransferable) {
}
}

我从主应用程序屏幕定义一个剪贴板对象,然后绑定(bind)鼠标点击的复制和粘贴处理程序:

在初始化期间,我分配了系统剪贴板:

    clippy = Toolkit.getDefaultToolkit().getSystemClipboard();

复制处理程序

    Node copyNode = ((CLIInfo) node.getUserObject()).DOMNode.cloneNode(true);
NodeCopyPaste contents = new NodeCopyPaste(copyNode);
clippy.setContents (contents, null);

粘贴处理程序

    Transferable clipboardContent = clippy.getContents (null);
Node clonedNode = null;
if ((clipboardContent != null) &&
(clipboardContent.isDataFlavorSupported (NodeCopyPaste.NodeFlavor))) {
try {
NodeCopyPaste tempNCP = (NodeCopyPaste) clipboardContent.getTransferData (NodeCopyPaste.NodeFlavor);
clonedNode = tempNCP.aNode.cloneNode(true);
}
catch (Exception e) {
e.printStackTrace ();
}

谢谢!

最佳答案

要在进程之间传输剪贴板数据,您需要使用可序列化类作为您的风格的表示类。 org.w3c.dom.Node 不扩展 Serializable,因此您的 NodeFlavor 无法复制到另一个进程。

另请注意,您错误地实现了 getTransferData() - 返回的对象应该是表示类的一个实例。

关于Java 在同一程序的两个运行副本之间复制/粘贴 org.w3c.dom.Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374635/

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