这些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 应该出现在数组的第一个元素。通常,首选顺序是从最丰富(或最复杂)的数据形式到简单集合的形式,即其他对象最可能理解的形式。