Swing 将javaJVMLocalObjectMimeType用于本地DnD,将序列化用于外部drop

Swing 将javaJVMLocalObjectMimeType用于本地DnD,将序列化用于外部drop,swing,drag-and-drop,Swing,Drag And Drop,我正在研究一个组件,其中堆叠了较小的组件。用户应该能够使用拖放更改这些组件的顺序。我通过实现一个TransferHandler来完成这项工作,它接受底层数据模型的本地引用DataFlavor(javaJVMLocalObjectMimeType)。这个很好用 现在,我还想再次运行我的应用程序,并能够将我的组件从一个应用程序拖到另一个应用程序中。在本例中,我希望将拖动源的必要数据捆绑到一个可序列化对象中,以便在drop应用程序中重建该对象,并为此使用可序列化的DataFlavor。我不想在这两种情

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

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

如何确定拖动操作是否起源于同一JVM,以便决定使用对象引用或数据的序列化版本。官方swing DnD文档提到可以混合本地和序列化风格,但没有说明如何最好地利用这一点

编辑

下面是我如何在我的
datamodel

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);
}
正如我所说,这在本地运行良好,但如果我从一个实例拖动到另一个实例,则会接受拖动,从而导致drop应用程序上出现
java.io.IOException:Owner无法转换数据
,而拖动源应用程序上出现
java.io.notserializableeexception:alignment.model.DataModel
。这是可以的,但拖动首先不应该在另一个应用程序上被接受


我使用的是
ArrayList
,因为我还希望能够一次拖动多个对象,仅供参考。

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

我刚刚发现了问题所在。我为未实现可序列化的数据模型的ArrayList编写了一个包装类
DataModelList
,并将我的数据风格声明修改为:

localFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=\"" +  DataModelList.class.getName() + "\"");
在此之后,如果拖放源和拖放目标不在同一JVM中,则认为它们之间的味道不相等


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

这也是我所期望的,但它不起作用。第一个实例中的本地引用样式在第二个实例中也被接受。@Moritz您能否在问题中包含一些代码,说明如何创建本地引用样式当我现在尝试使用javaJVMLocalObjectMimeType时,在应用程序的第二个实例中,我看到的是在我的
canImport
中调用的调用
isDataFlavorSupported
,返回
true
,但是
getTransferable.getTransferData
from
importData
返回了
null