У меня есть программа, которая показывает древовидное представление файла 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 ();
}
Спасибо!