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