DnD 简介
如果要编写应用程序,则需要支持在应用程序中的组件之间传输信息的功能。但是,您还希望您的应用程序与其他应用程序兼容-这包括支持在应用程序和其他 Java 应用程序之间以及应用程序和本机应用程序之间传输信息的能力。传输数据的能力有两种形式:
- 拖放(DnD)支持。下图说明了从
JList
拖放到JTextField
组件(箭头显示了数据的路径):
- 通过剪切或复制和粘贴剪贴板传输。下图显示了从
JList
剪切(或复制)并粘贴到JTextField
组件上的情况:
拖放-幕后花絮
假设有一个名为 Rollo 的用户,该用户正在运行 Java 应用程序。他想从列表中拖动一些文本并将其保存到文本字段中。 (请注意,从本地应用程序拖放到 Java 应用程序时,该过程是相同的.)简而言之,拖放过程的工作方式如下:
-
Rollo 在* source 组件:列表中选择了一行文本。按住鼠标键,Rollo 开始拖动文本-这将启动拖动手势*。
-
拖动开始时,列表会打包* export 的数据并声明其支持的 source action *,例如
COPY
,MOVE
或LINK
。 -
在 Rollo 拖动数据时,Swing 会连续计算位置并处理渲染。
-
如果 Rollo 在拖动过程中同时按住 Shift 和/或 Control 键,则此用户操作也是拖动手势的一部分。通常,普通拖动请求
MOVE
操作。拖动时按住 Ctrl 键请求COPY
动作,同时按住 Shift 和 Ctrl 键请求LINK
动作。 -
一旦 Rollo 将文本拖到文本字段组件的边界上,就会连续轮询* target *以查看它是否接受或拒绝潜在的掉落。当他拖动时,目标通过显示“放置位置”(可能是插入光标或突出显示的选择)来提供反馈。在这种情况下,文本字段(当前目标)允许替换所选文本和插入新文本。
-
当 Rollo 释放鼠标按钮时,文本组件将检查声明的源操作和任何用户操作,然后从可用选项中选择所需的内容。在这种情况下,文本字段选择在放置点插入新文本。
-
最后,文本字段导入数据。
尽管这似乎是一个艰巨的过程,但 Swing 为您处理了大部分工作。设计该框架的 Object 是,您可以插入特定于组件的详细信息,其余的“工作正常”。
下一节将对此进行更多介绍。
Note:
我们不建议您使用 AWT 类创建自己的拖放支持。此实现将需要每个组件内部的大量复杂支持。在 1.4 版之前,当 dnd 系统被重新设计时,开发人员偶尔会创建自己的 dnd 支持,但是它不能与复杂的组件(如树和表)一起使用,这些组件具有微妙的选择和删除问题。