我正在开发一个组件,其中堆叠了较小的组件。用户应该能够使用拖放来更改这些组件的顺序。我通过实现一个接受底层数据模型的本地引用DataFlavor
( ) 的 TransferHandler 来完成这项工作。javaJVMLocalObjectMimeType
这工作正常。
现在我还想再次运行我的应用程序,并能够将我的组件从一个应用程序拖到另一个应用程序中。在这种情况下,我想将拖动源的必要数据捆绑到一个可序列化的对象中,以在拖放应用程序中重建该对象并为此使用可序列化的 DataFlavor。我不想在这两种情况下都使用对象序列化。
如何确定我的拖动操作是否源自同一个 JVM,以便我可以决定使用对象引用还是数据的序列化版本。官方的 swing 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
上的一个和拖动源应用程序上的一个。这没关系,但首先不应在另一个应用程序上接受拖动。
我正在使用 aArrayList
因为我还希望能够一次拖动多个对象,仅供参考。