# 使用和创建 DataFlavor

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/dnd/dataflavor.html](https://docs.oracle.com/javase/tutorial/uiswing/dnd/dataflavor.html)

[`DataFlavor`](https://docs.oracle.com/javase/8/docs/api/java/awt/datatransfer/DataFlavor.html) 类允许您指定数据的内容类型。从`importData`方法获取数据时，需要指定`DataFlavor`。为您预定义了几种风味类型：

*   [`imageFlavor`](https://docs.oracle.com/javase/8/docs/api/java/awt/datatransfer/DataFlavor.html#imageFlavor) 表示`java.awt.Image`格式的数据。拖动图像数据时使用此选项。
*   [`stringFlavor`](https://docs.oracle.com/javase/8/docs/api/java/awt/datatransfer/DataFlavor.html#stringFlavor) 表示最基本的文本形式的数据 - `java.lang.String`。对于大多数应用程序来说，这是最常用的数据风格。
*   [`javaFileListFlavor`](https://docs.oracle.com/javase/8/docs/api/java/awt/datatransfer/DataFlavor.html#javaFileListFlavor) 以`java.util.List`格式表示`java.io.File`对象。这对于拖动文件的应用程序非常有用，例如[顶级掉落](toplevel.html)课程中讨论的`TopLevelTransferHandler`示例。

对于大多数应用程序，您只需了解数据风格即可。但是，如果您需要除这些预定义类型之外的其他类型，则可以创建自己的类型。如果您创建自定义组件并希望它参与数据传输，则需要创建自定义数据类型。用于指定数据 flavor 的构造函数是 [`DataFlavor(Class, String)`](https://docs.oracle.com/javase/8/docs/api/java/awt/datatransfer/DataFlavor.html#DataFlavor-java.lang.Class-java.lang.String-) 。例如，要为`java.util.ArrayList`类创建数据 flavor：

```
new DataFlavor(ArrayList.class, "ArrayList");

```

要为整数数组创建数据 flavor：

```
new DataFlavor(int[].class, "Integer Array");

```

使用此机制传输数据使用`Object`序列化，因此用于传输数据的类必须实现`Serializable`接口，因为必须使用它进行序列化。如果一切都不可序列化，您将在删除或复制到剪贴板期间看到`NotSerializableException`。

使用`DataFlavor(Class, String)`构造函数创建数据 flavor 可以在应用程序之间传输数据，包括本机应用程序。如果要创建仅在应用程序内传输数据的数据风格，请使用 [``javaJVMLocalObjectMimeType``](https://docs.oracle.com/javase/8/docs/api/java/awt/datatransfer/DataFlavor.html#javaJVMLocalObjectMimeType)和 [``DataFlavor(String)``](https://docs.oracle.com/javase/8/docs/api/java/awt/datatransfer/DataFlavor.html#DataFlavor-java.lang.String-)构造函数。例如，要指定仅在应用程序中从`JColorChooser`传输颜色的数据 flavor，您可以使用以下代码：

```
String colorType = DataFlavor.javaJVMLocalObjectMimeType +
                   ";class=java.awt.Color";
DataFlavor colorFlavor = new DataFlavor(colorType);

```

要为`ArrayList`创建仅在您的应用程序中起作用的数据风格：

```
new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType +
               ";class=java.util.ArrayList");

```

要为整数数组创建数据 flavor：

```
new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType +
               ";class=\"" + int[].class.getName() + "\"");

```

包含特殊字符的 MIME 类型，例如 **[**或**;** ，必须将这些字符括在引号中。

可以实现`Transferable`以支持多种口味。例如，您可以同时使用本地和序列化风格，或者您可以使用相同数据的两种形式，例如`ArrayList`和整数数组风格，或者您可以创建接受不同类型的`TransferHandler`数据，如颜色和文字。

当您创建从`Transferable`的 [`getTransferDataFlavors`](https://docs.oracle.com/javase/8/docs/api/java/awt/datatransfer/Transferable.html#getTransferDataFlavors--) 方法返回的`DataFlavors`数组时，应按首选顺序插入样式，最优选出现在数组的元素 0 处。通常，首选顺序是从最丰富或最复杂的数据形式到简单集 - 最容易被其他对象理解的形式。