对于本地DnD使用javaJVMLocalObjectMimeType,对外部drop使用序列化

时间:2012-05-07 15:00:21

标签: swing drag-and-drop

我正在研究堆叠较小组件的组件。用户应该能够使用拖放更改这些组件的顺序。我通过实现一个TransferHandler来完成这项工作,该TransferHandler接受底层数据模型的本地引用DataFlavorjavaJVMLocalObjectMimeType)。这很好。

现在我想再次运行我的应用程序,并能够将我的组件从一个应用程序拖到另一个应用程序中。在这种情况下,我想将拖动源的必要数据捆绑到一个可序列化的对象中,以在drop应用程序中重建对象,并使用可序列化的DataFlavor。我不想在两种情况下都使用对象序列化。

如何确定我的拖动操作是否源自同一个JVM,以便我可以决定使用对象引用或数据的序列化版本。官方摇摆DnD文档提到可以混合本地和序列化的味道,但它没有告诉如何充分利用它。

修改

以下是我在DataModelTransferable

中创建风味的方法
public static DataFlavor localFlavor;

static {
    try {
        localFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=\"" +  ArrayList.class.getName() + "\"");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
...
@Override
public DataFlavor[] getTransferDataFlavors() {
    return new DataFlavor[] { localFlavor };
}

TransferHandler我这样做

@Override
public boolean canImport(TransferSupport support) {
    return support.isDataFlavorSupported(DataModelTransferable.localFlavor);
}

正如我所说,这在本地工作正常,但如果我从一个实例拖到另一个实例,则会接受拖动,这会导致拖放应用程序上的java.io.IOException: Owner failed to convert data和拖动源应用程序上的java.io.NotSerializableException: alignment.model.DataModel 。这没关系,但首先不应该在另一个应用程序上接受拖动。

我正在使用ArrayList,因为我也希望能够同时拖动多个对象,fyi。

2 个答案:

答案 0 :(得分:2)

我刚刚发现自己的问题是什么。我为DataModels的ArrayList编写了一个包装类DataModelList,它没有实现Serializable并修改了我的数据风格声明:

localFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=\"" +  DataModelList.class.getName() + "\"");

之后,如果拖动源和放置目标不在同一个JVM中,则不会认为这种风格是相同的。

我的结论是,不可能直接使用实现Serializable的类的本地对象引用flavor。如果有人知道记录在哪里,我会很高兴听到它。

答案 1 :(得分:0)

对于每个正在运行的JVM,您的对象引用flavor通常会有所不同。因此,在您要求“序列化数据风格版本”之前,首先要检查Transferable是否支持您的“对象引用风格”。