Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在同一程序的两个运行副本之间复制/粘贴org.w3c.dom.Node_Java_Dom_Copy_Paste - Fatal编程技术网

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

Java 在同一程序的两个运行副本之间复制/粘贴org.w3c.dom.Node,java,dom,copy,paste,Java,Dom,Copy,Paste,我有一个显示XML文件树表示的程序。通过在线使用多个源,我可以在程序工作的单个实例中进行复制/粘贴。我正在使用系统剪贴板。但我需要的是能够从程序的一个实例复制节点,并粘贴到同一程序的另一个实例 我尝试了许多不同的选择,都导致了相同的行为。从同一应用程序中粘贴时,剪贴板内容包含一个“可转移”对象,该对象具有正确的数据,并且isLocal设置为“true”。当我执行复制,然后尝试从运行clipboardContent的同一程序的另一个实例粘贴包含“flavorsToData”哈希映射和“flavor

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

我尝试了许多不同的选择,都导致了相同的行为。从同一应用程序中粘贴时,剪贴板内容包含一个“可转移”对象,该对象具有正确的数据,并且isLocal设置为“true”。当我执行复制,然后尝试从运行clipboardContent的同一程序的另一个实例粘贴包含“flavorsToData”哈希映射和“flavors”值时,检查isDataFlavorSupported失败(从未命中表示新味道的自定义类)

我已经尝试在getContents()调用中为requestor对象使用不同的值。同样,我也尝试了几个不同的剪贴簿所有者来调用setContent()。两者似乎都没有以任何方式改变行为

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

此类用于定义DataFlavor和可转移对象:

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()方法将一个文档(导入子节点文件)复制到现有的“文档”。我仍然对如何在程序的两个实例之间复制/粘贴感兴趣。但现在我的用户对这种新方法很满意。