DnD 简介

如果要编写应用程序,则需要支持在应用程序中的组件之间传输信息的功能。但是,您还希望您的应用程序与其他应用程序兼容-这包括支持在应用程序和其他 Java 应用程序之间以及应用程序和本机应用程序之间传输信息的能力。传输数据的能力有两种形式:

  • 拖放(DnD)支持。下图说明了从JList拖放到JTextField组件(箭头显示了数据的路径):

拖放图

  • 通过剪切或复制和粘贴剪贴板传输。下图显示了从JList剪切(或复制)并粘贴到JTextField组件上的情况:

Cut/Copy/Paste Illustration

拖放-幕后花絮

假设有一个名为 Rollo 的用户,该用户正在运行 Java 应用程序。他想从列表中拖动一些文本并将其保存到文本字段中。 (请注意,从本地应用程序拖放到 Java 应用程序时,该过程是相同的.)简而言之,拖放过程的工作方式如下:

  • Rollo 在* source 组件:列表中选择了一行文本。按住鼠标键,Rollo 开始拖动文本-这将启动拖动手势*。

  • 拖动开始时,列表会打包* export 的数据并声明其支持的 source action *,例如COPYMOVELINK

  • 在 Rollo 拖动数据时,Swing 会连续计算位置并处理渲染。

  • 如果 Rollo 在拖动过程中同时按住 Shift 和/或 Control 键,则此用户操作也是拖动手势的一部分。通常,普通拖动请求MOVE操作。拖动时按住 Ctrl 键请求COPY动作,同时按住 Shift 和 Ctrl 键请求LINK动作。

  • 一旦 Rollo 将文本拖到文本字段组件的边界上,就会连续轮询* target *以查看它是否接受或拒绝潜在的掉落。当他拖动时,目标通过显示“放置位置”(可能是插入光标或突出显示的选择)来提供反馈。在这种情况下,文本字段(当前目标)允许替换所选文本和插入新文本。

  • 当 Rollo 释放鼠标按钮时,文本组件将检查声明的源操作和任何用户操作,然后从可用选项中选择所需的内容。在这种情况下,文本字段选择在放置点插入新文本。

  • 最后,文本字段导入数据。

尽管这似乎是一个艰巨的过程,但 Swing 为您处理了大部分工作。设计该框架的 Object 是,您可以插入特定于组件的详细信息,其余的“工作正常”。

下一节将对此进行更多介绍。

Note:

我们不建议您使用 AWT 类创建自己的拖放支持。此实现将需要每个组件内部的大量复杂支持。在 1.4 版之前,当 dnd 系统被重新设计时,开发人员偶尔会创建自己的 dnd 支持,但是它不能与复杂的组件(如树和表)一起使用,这些组件具有微妙的选择和删除问题。