3

XML ファイルのツリー表現を表示するプログラムがあります。オンラインで多数のソースを使用して、プログラムの単一インスタンス内でコピー/貼り付けを行っています。システムクリップボードを使用しています。私が必要としているのは、プログラムの 1 つのインスタンスからノードをコピーして、同じプログラムの別のインスタンスに貼り付けられることです。

さまざまなオプションをいくつか試しましたが、すべて同じ動作になりました。同じアプリケーション内から貼り付けた場合、clipboardContent には、「true」に設定された 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) {
    } 
}

アプリケーションのメイン画面から 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 ();
    }

ありがとう!

4

2 に答える 2

1

プロセス間でクリップボード データを転送するには、Serializable クラスをフレーバーの表現クラスとして使用する必要があります。org.w3c.dom.Node は Serializable を拡張しないため、NodeFlavor を別のプロセスにコピーすることはできません。

getTransferData() を正しく実装していないことにも注意してください。返されるオブジェクトは、表現クラスのインスタンスである必要があります。

于 2010-03-08T06:00:49.407 に答える
0

シリアライゼーションといえば、XML データのマーシャリング/アンマーシャリングにJAXBを使用することを検討してください (シリアライズ/デシリアライズと見なすことができます)。

于 2010-03-11T19:09:01.567 に答える