这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请查看Java语言更改,了解Java SE 9及其后续版本中更新的语言特性的摘要。
请查看JDK发行说明,了解有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
DataFlavor类允许您指定数据的内容类型。在从importData方法获取数据时,您需要指定一个DataFlavor。有几种预定义的类型可以供您使用:
imageFlavor表示java.awt.Image格式的数据。当拖动图像数据时使用。stringFlavor表示最基本的文本形式的数据 — java.lang.String。这是大多数应用程序中最常用的数据类型。javaFileListFlavor表示java.util.List格式的java.io.File对象。这对于拖放文件的应用程序非常有用,例如在顶级拖放课程中讨论的TopLevelTransferHandler示例。对于大多数应用程序,这就是关于数据类型的全部知识。然而,如果您需要除这些预定义类型之外的类型,可以创建自己的类型。如果您创建了一个自定义组件并希望它参与数据传输,您将需要创建一个自定义的数据类型。指定数据类型的构造函数是DataFlavor(Class, String)。例如,要为java.util.ArrayList类创建一个数据类型:
new DataFlavor(ArrayList.class, "ArrayList");
要为整数数组创建一个数据类型:
new DataFlavor(int[].class, "Integer Array");
使用此机制传输数据使用的是Object序列化,因此您用于传输数据的类必须实现Serializable接口,以及与其一起序列化的任何内容。如果一切都不可序列化,您将在放置或复制到剪贴板时看到一个NotSerializableException。
使用DataFlavor(Class, String)构造函数创建数据类型允许您在应用程序之间传输数据,包括本机应用程序。如果您想创建仅在应用程序内部传输数据的数据类型,请使用和javaJVMLocalObjectMimeType构造函数。例如,要指定一个仅在应用程序内部从DataFlavor(String)JColorChooser传输颜色的数据类型,可以使用以下代码:
String colorType = DataFlavor.javaJVMLocalObjectMimeType +
";class=java.awt.Color";
DataFlavor colorFlavor = new DataFlavor(colorType);
要创建一个仅在应用程序内部使用的 ArrayList 数据类型的数据 flavor:
new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType +
";class=java.util.ArrayList");
要创建一个整数数组的数据 flavor:
new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType +
";class=\"" + int[].class.getName() + "\"");
包含特殊字符的 MIME 类型,例如 [ 或 ;,必须将这些字符用引号括起来。
Transferable 可以实现支持多种数据 flavor。例如,您可以同时使用本地和序列化 flavor,或者同时使用两种形式的相同数据,例如 ArrayList 和整数数组 flavor,或者创建一个接受不同类型数据(例如颜色和文本)的 TransferHandler。
在从 Transferable 的 getTransferDataFlavors 方法返回的 DataFlavors 数组中,应按照首选顺序插入 flavor,其中最首选的 flavor 应该出现在数组的第一个元素。通常,首选顺序是从最丰富(或最复杂)的数据形式到简单集合的形式,即其他对象最可能理解的形式。