Java 在同一程序的两个运行副本之间复制/粘贴org.w3c.dom.Node
我有一个显示XML文件树表示的程序。通过在线使用多个源,我可以在程序工作的单个实例中进行复制/粘贴。我正在使用系统剪贴板。但我需要的是能够从程序的一个实例复制节点,并粘贴到同一程序的另一个实例 我尝试了许多不同的选择,都导致了相同的行为。从同一应用程序中粘贴时,剪贴板内容包含一个“可转移”对象,该对象具有正确的数据,并且isLocal设置为“true”。当我执行复制,然后尝试从运行clipboardContent的同一程序的另一个实例粘贴包含“flavorsToData”哈希映射和“flavors”值时,检查isDataFlavorSupported失败(从未命中表示新味道的自定义类) 我已经尝试在getContents()调用中为requestor对象使用不同的值。同样,我也尝试了几个不同的剪贴簿所有者来调用setContent()。两者似乎都没有以任何方式改变行为 我非常想将被复制的节点转换回文本XML格式,然后在粘贴时转换回DOM模型,但如果可能的话,我宁愿不这样做 此类用于定义DataFlavor和可转移对象:Java 在同一程序的两个运行副本之间复制/粘贴org.w3c.dom.Node,java,dom,copy,paste,Java,Dom,Copy,Paste,我有一个显示XML文件树表示的程序。通过在线使用多个源,我可以在程序工作的单个实例中进行复制/粘贴。我正在使用系统剪贴板。但我需要的是能够从程序的一个实例复制节点,并粘贴到同一程序的另一个实例 我尝试了许多不同的选择,都导致了相同的行为。从同一应用程序中粘贴时,剪贴板内容包含一个“可转移”对象,该对象具有正确的数据,并且isLocal设置为“true”。当我执行复制,然后尝试从运行clipboardContent的同一程序的另一个实例粘贴包含“flavorsToData”哈希映射和“flavor
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) {
}
}
我从主应用程序屏幕定义剪贴板对象,然后为鼠标单击绑定复制和粘贴处理程序:
在初始化期间,我分配系统剪贴板:
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复制到其他进程
还注意到您正在错误地实现GETTrimeDATA()。返回的对象应该是表示类的一个实例。
序列化:考虑使用编组/解封XML数据(可以被看作序列化/反序列化)。我采用了“导出节点/导入节点”的方法。我没有使用剪贴板,而是根据选定的树条目保存子树。然后从同一运行版本或任何其他版本导入节点。这里的技巧是,我需要使用importNode()方法将一个文档(导入子节点文件)复制到现有的“文档”。我仍然对如何在程序的两个实例之间复制/粘贴感兴趣。但现在我的用户对这种新方法很满意。