Java Copy / Paste org.w3c.dom.Node между двумя работающими копиями одной и той же программы - PullRequest
3 голосов
/ 03 марта 2010

У меня есть программа, которая показывает древовидное представление файла XML. Используя несколько источников в Интернете, у меня есть Копировать / Вставить в одном экземпляре работающей программы. Я использую систему буфера обмена. Однако мне нужно иметь возможность скопировать узел из одного экземпляра программы и вставить в другой экземпляр той же программы.

Я пробовал несколько разных опций, каждый из которых приводил к одному и тому же поведению. При вставке из одного и того же приложения clipboardContent содержит «переносимый» объект с правильными данными, а для isLocal установлено значение «true». Когда я выполняю копирование, а затем пытаюсь вставить из другого экземпляра той же программы, в которой работает clipboardContent, содержатся значения «flavorsToData» HashMap и «flavors», проверка isDataFlavorSupported завершается неудачно (никогда не попадает в мой пользовательский класс, представляющий новый вкус).

Я пытался использовать разные значения для объекта запроса в вызове getContents (). Точно так же я пробовал несколько разных ClipboardOwners для вызова 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 ();
    }

Спасибо!

Ответы [ 2 ]

1 голос
/ 08 марта 2010

Для передачи данных из буфера обмена между процессами вам нужно использовать класс Serializable в качестве класса представления для вашего варианта. org.w3c.dom.Node не расширяет Serializable, поэтому ваш NodeFlavor нельзя скопировать в другой процесс.

Обратите внимание, что вы неправильно реализуете getTransferData () - возвращаемый объект должен быть экземпляром класса представления.

0 голосов
/ 11 марта 2010

Говоря о сериализации: рассмотрите возможность использования JAXB для маршалинга / демаршаллинга XML-данных (что может рассматриваться как сериализация / десериализация).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...