gpt4 book ai didi

swing - 使用 javaJVMLocalObjectMimeType 进行本地 DnD 和序列化以进行外部放置

转载 作者:行者123 更新时间:2023-12-02 02:16:10 25 4
gpt4 key购买 nike

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

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

如何确定我的拖动操作是否源自同一个 JVM,以便我可以决定使用对象引用还是数据的序列化版本。官方 swing DnD 文档提到可以混合本地和序列化风格,但没有说明如何充分利用它。

编辑

下面是我如何在我的 DataModelTransferable 中创建 flavor

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,因为我还希望能够一次拖动多个对象,仅供引用。

最佳答案

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

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

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

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

关于swing - 使用 javaJVMLocalObjectMimeType 进行本地 DnD 和序列化以进行外部放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10484344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com