这些Java教程是为JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及以后版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息,请参阅JDK发行说明。
数据传输机制的核心是 TransferHandler 类。正如其名称所示,TransferHandler 提供了一个简单的机制,用于在 JComponent 之间传输数据 - 所有的细节都包含在这个类及其支持类中。大多数组件都提供了一个默认的传输处理程序。您可以在任何组件上创建和安装自己的传输处理程序。
有三种方法用于在组件上使用 TransferHandler:
setDragEnabled(boolean) — 启用拖动支持。(默认值为 false。)此方法在每个支持拖动手势的组件上定义;链接将带您到 JList 的文档。setDropMode(DropMode) — 配置如何确定放置位置。此方法在 JList、JTable 和 JTree 上定义;链接将带您到 JList 的文档。setTransferHandler(TransferHandler) — 用于插入自定义数据导入和导出。此方法在 JComponent 上定义,因此它被每个 Swing 组件继承。正如前面提到的,Swing 的默认传输处理程序(例如文本组件和颜色选择器使用的处理程序)提供了被认为对于数据的导入和导出最有用的支持。然而,列表、表格和树不会默认支持放置。原因是这些组件没有通用的处理放置的方式。例如,在 JTree 的特定节点上放置意味着什么?是替换该节点,插入到该节点下方,还是作为该节点的子节点插入?而且,我们不知道树后面是什么类型的模型 - 它可能是不可变的。
虽然 Swing 不能为这些组件提供默认实现,但放置的框架已经存在。您只需要提供一个自定义的 TransferHandler 来管理实际的数据导入。
如果将自定义的 TransferHandler 安装到 Swing 组件上,将替换默认的支持。例如,如果用处理颜色的处理程序替换了 JTextField 的 TransferHandler,将禁用其支持文本的导入和导出能力。
如果必须替换默认的 TransferHandler - 例如,处理文本的处理程序 - 您需要重新实现文本的导入和导出能力。这不需要像 Swing 提供的那样复杂 - 根据您的应用程序需求,它可以简单地支持 StringFlavor 数据类型。
接下来,我们将展示实现数据导出所需的 TransferHandler 方法。