460.md 3.0 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8
# DnD 简介

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

如果您正在编写应用程序,则需要支持在应用程序中的组件之间传输信息的功能。但您也希望您的应用程序能够很好地与其他应用程序一起运行 - 这包括支持在应用程序和其他 Java 应用程序之间以及应用程序和本机应用程序之间传输信息的能力。传输数据的能力有两种形式:

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

W
wizardforcel 已提交
9
    ![Drag and Drop Illustration](img/1f470d183d3409e1abbd6e9e048983ef.jpg)
W
init  
wizardforcel 已提交
10 11 12

*   剪贴板通过剪切或复制和粘贴转移。下图显示从`JList`切割(或复制)并粘贴到`JTextField`组件:

W
wizardforcel 已提交
13
    ![Cut/Copy/Paste Illustration](img/660f11350ac3675902bb58bafec2a49e.jpg)
W
init  
wizardforcel 已提交
14 15 16 17 18

## 拖放 - 幕后花絮

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

W
wizardforcel 已提交
19 20
*   Rollo 在*源*组件中选择了一行文本:列表。按住鼠标按钮 Rollo 开始拖动文本 - 这会启动*拖动手势*
*   当拖动开始时,列表打包 _export_ 的数据并声明它支持的*源动作*,例如`COPY``MOVE``LINK`
W
init  
wizardforcel 已提交
21
*   当 Rollo 拖动数据时,Swing 会不断计算位置并处理渲染。
W
wizardforcel 已提交
22 23
*   如果 Rollo 在拖动过程中同时按住 Shift 和/或 Control 键,则*用户动作*也是拖动动作的一部分。通常,普通拖动请求`MOVE`操作。拖动时按住 Control 键请求`COPY`动作,同时按住 Shift 和 Control 请求`LINK`动作。
*   一旦 Rollo 在文本字段组件的边界上拖动文本,就会不断轮询*目标*以查看它是否接受或拒绝潜在的丢弃。当他拖动时,目标通过显示*放置位置*来提供反馈,可能是插入光标或突出显示的选择。在这种情况下,文本字段(当前目标)允许替换所选文本和插入新文本。
W
init  
wizardforcel 已提交
24
*   当 Rollo 释放鼠标按钮时,文本组件检查声明的源操作和任何用户操作,然后从可用选项中选择它想要的内容。在这种情况下,文本字段选择在删除点插入新文本。
W
wizardforcel 已提交
25
*   最后,文本字段*导入*数据。
W
init  
wizardforcel 已提交
26 27 28 29 30 31 32 33 34

虽然这看起来像是一个令人生畏的过程,但 Swing 会为您处理大部分工作。该框架的设计使您可以插入特定于组件的详细信息,其余的“正常工作”。

更多相关内容将在下一节中介绍。

* * *

**Note:** 

W
wizardforcel 已提交
35
我们*不建议*使用 AWT 类创建自己的拖放支持。这种实现需要在每个组件内部提供重要的复杂支持。在 dnd 系统重新发布之前的版本 1.4 之前,开发人员偶尔会创建自己的 dnd 支持,但它不适用于具有微妙选择和丢弃问题的复杂组件,如树和表。
W
init  
wizardforcel 已提交
36 37

* * *