# 位置敏感下降

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

有时你有一个复杂的组件，你希望用户能够放弃它的某些部分，而不是其他部分。也许它是一个允许仅在某些列中删除数据的表;或者它可能是一棵树，只允许在某些节点上删除数据。显然，您希望光标提供准确的反馈 - 它应该仅在接受丢弃的组件的特定部分上显示丢弃位置。

通过在`TransferHandler`类的 [`canImport(TransferHandler.TransferSupport`）](https://docs.oracle.com/javase/8/docs/api/javax/swing/TransferHandler.html#canImport-javax.swing.TransferHandler.TransferSupport-)方法中安装必要的逻辑，可以很容易地完成此操作。它仅适用于`canImport`的此特定版本，因为在拖动手势超出组件边界时会连续调用它。当此方法返回 true 时，Swing 显示放置光标，并在视觉上指示放置位置;当此方法返回 false 时，Swing 显示“无拖动”光标，并且不显示放置位置。

例如，假设一个表允许删除，但不在第一列中。 `canImport`方法可能如下所示：

```
public boolean canImport(TransferHandler.TransferSupport info) {
    // for the demo, we will only support drops (not clipboard paste)
    if (!info.isDrop()) {
        return false;
    }

    // we only import Strings
    if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) {
        return false;
    }

    // fetch the drop location
    JTable.DropLocation dl = (JTable.DropLocation)info.getDropLocation();

    int column = dl.getColumn();

    // we do not support invalid columns or the first column
    if (column == -1 || column == 0) {
        return false;
    }

    return true;
}

```

以粗体显示的代码表示位置敏感的丢弃逻辑：当用户以无法计算列（因此无效）的方式删除数据时，或者当用户删除第一列中的文本时，`canImport`方法返回 false - 因此 Swing 显示“无拖动”鼠标光标。一旦用户将鼠标移开第一列`canImport`，则返回 true，Swing 显示拖动光标。

接下来，我们将展示一个已实现位置敏感性下降的树的演示。