# 设置丢弃模式

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

在组件（例如列表）上启用 drop 时，您需要决定如何解释放置位置。例如，您是否要限制用户替换现有条目？您是否只想添加或插入新条目？你想两个都允许吗？要配置此行为， [`JList`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JList.html) 类提供 [`setDropMode`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JList.html#setDropMode-javax.swing.DropMode-) 方法，该方法支持以下丢弃模式。

*   `JList`的默认下降模式为`DropMode.USE_SELECTION`。在此模式下拖动时，列表中的所选项目将移动以回显潜在的放置点。在下拉列表中，所选项目将转移到放置位置。此模式用于向后兼容，但不建议使用。
*   在`DropMode.ON`中，列表中的所选项目将移动以回显潜在的放置点，但所选项目不会受到影响。此模式可用于放在现有列表项之上。
*   在`DropMode.INSERT`中，用户被限制为选择现有列表项之间的空间，或者在列表中的第一项之前或最后一项之后。不允许选择现有列表项。
*   `DropMode.ON_OR_INSERT`是`ON`和`INSERT`模式的组合。

`JTree`类提供相同的[丢弃模式](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTree.html#setDropMode-javax.swing.DropMode-)，`JTable`类具有[几个](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.html#setDropMode-javax.swing.DropMode-)特定于添加行或列。

为了获得下落的位置，`TransferSupport`类提供 [`getDropLocation`](https://docs.oracle.com/javase/8/docs/api/javax/swing/TransferHandler.TransferSupport.html#getDropLocation--) 方法，该方法返回发生下降的精确点。但是对于列表组件，drop 的索引比像素位置更有用，因此`JList`提供了一个特殊的子类，称为 [`JList.DropLocation`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JList.DropLocation.html) 。这个类提供 [`getIndex`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JList.DropLocation.html#getIndex--) 和 [`isInsert`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JList.DropLocation.html#isInsert--) 方法，为您处理数学。

表，树和文本组件各自提供`DropLocation`的实现，其中的方法对每个组件最有意义。 [`JTable.setDropMode`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.html#setDropMode-javax.swing.DropMode-) 方法有多种选择。下表显示了所有四个类的方法：

DropLocation Methods for JList, JTree, JTable and JTextComponent
| [`JList.DropLocation`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JList.DropLocation.html) | [`JTree.DropLocation`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTree.DropLocation.html) | [`JTable.DropLocation`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.DropLocation.html) | [`JTextComponent.DropLocation`](https://docs.oracle.com/javase/8/docs/api/javax/swing/text/JTextComponent.DropLocation.html) |
| --- | --- | --- | --- |
| [`isInsert`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JList.DropLocation.html#isInsert--) | [`getChildIndex`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTree.DropLocation.html#getChildIndex--) | [`isInsertRow`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.DropLocation.html#isInsertRow--) | [`getIndex`](https://docs.oracle.com/javase/8/docs/api/javax/swing/text/JTextComponent.DropLocation.html#getIndex--) |
| [`getIndex`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JList.DropLocation.html#getIndex--) | [`getPath`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTree.DropLocation.html#getPath--) | [`isInsertColumn`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.DropLocation.html#isInsertColumn--) | [`getBias`](https://docs.oracle.com/javase/8/docs/api/javax/swing/text/JTextComponent.DropLocation.html#getBias--) |
|  |  | [`getRow`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.DropLocation.html#getRow--) |  |
|  |  | [`getColumn`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.DropLocation.html#getColumn--) |  |

接下来是一个演示，它为列表组件实现自定义传输处理程序，以便它完全参与拖放操作。