我正在研究堆叠较小组件的组件。用户应该能够使用拖放更改这些组件的顺序。我通过实现一个TransferHandler来完成这项工作,该TransferHandler接受底层数据模型的本地引用DataFlavor
(javaJVMLocalObjectMimeType
)。这很好。
现在我想再次运行我的应用程序,并能够将我的组件从一个应用程序拖到另一个应用程序中。在这种情况下,我想将拖动源的必要数据捆绑到一个可序列化的对象中,以在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。
答案 0 :(得分:2)
我刚刚发现自己的问题是什么。我为DataModels的ArrayList编写了一个包装类DataModelList
,它没有实现Serializable
并修改了我的数据风格声明:
localFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=\"" + DataModelList.class.getName() + "\"");
之后,如果拖动源和放置目标不在同一个JVM中,则不会认为这种风格是相同的。
我的结论是,不可能直接使用实现Serializable
的类的本地对象引用flavor。如果有人知道记录在哪里,我会很高兴听到它。
答案 1 :(得分:0)
对于每个正在运行的JVM,您的对象引用flavor通常会有所不同。因此,在您要求“序列化数据风格版本”之前,首先要检查Transferable
是否支持您的“对象引用风格”。