3

我有一个显示 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 ();
    }

谢谢!

4

2 回答 2

1

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

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

于 2010-03-08T06:00:49.407 回答
0

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

于 2010-03-11T19:09:01.567 回答