【问题标题】:Java Copy/Paste org.w3c.dom.Node between two running copies of the same programJava 在同一程序的两个运行副本之间复制/粘贴 org.w3c.dom.Node
【发布时间】:2010-03-03 20:20:33
【问题描述】:

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

我尝试了许多不同的选项,所有选项都导致相同的行为。从同一应用程序中粘贴时,剪贴板内容包含一个“可传输”对象,其中包含正确的数据以及设置为“真”的 isLocal。当我执行复制然后尝试从运行剪贴板内容的同一程序的另一个实例进行粘贴时,剪贴板内容包含“flavorsToData”HashMap 和“flavors”值,isDataFlavorSupported 的检查失败(永远不会命中代表新风味的我的自定义类)。

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

我非常想将被复制的节点转换回文本 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 ();
    }

谢谢!

【问题讨论】:

  • 我在这个领域没有什么吸引力。我采用了“导出节点/导入节点”方法。我没有使用剪贴板,而是根据选定的树条目保存子树。然后从相同的运行版本或任何其他版本,我可以导入节点。这里的技巧是弄清楚我需要使用 importNode() 方法从一个文档(导入子节点文件)复制到现有的“文档”。我仍然对弄清楚如何在我的程序的两个实例之间复制/粘贴非常感兴趣。但目前我的用户对新方法感到满意。

标签: java dom copy paste


【解决方案1】:

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

还请注意,您正在错误地实现 getTransferData() - 返回的对象应该是表示类的实例。

【讨论】:

    【解决方案2】:

    说到序列化:考虑使用JAXB 编组/解组XML 数据(可以看作是序列化/反序列化)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-27
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多