3

我正在开发一个组件,其中堆叠了较小的组件。用户应该能够使用拖放来更改这些组件的顺序。我通过实现一个接受底层数据模型的本地引用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因为我还希望能够一次拖动多个对象,仅供参考。

4

2 回答 2

2

我自己才发现问题出在哪里。我为我的 ArrayList of DataModels 编写了一个包装类DataModelList,它没有实现Serializable并将我的数据风格的声明修改为:

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

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

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

于 2012-05-08T09:39:20.777 回答
0

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

于 2012-05-07T16:53:03.110 回答