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

时间:2010-03-03 20:20:34

标签: java dom copy paste

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

我尝试了许多不同的选项,都导致了相同的行为。当从同一个应用程序中粘贴时,clipboardContent包含一个“可转移”对象,其中包含正确的数据以及isLocal设置为“true”。当我执行副本然后尝试从同一程序的另一个实例粘贴时,运行clipboardContent包含一个“flavorsToData”HashMap和“flavors”值,isDataFlavorSupported的检查失败(永远不会点击代表新风味的自定义类)。

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

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

我从主应用程序屏幕定义了一个Clipboard对象,然后为鼠标点击绑定了复制和粘贴处理程序:

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

    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 ();
    }

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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