# 选择掉落动作

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

每个拖动源（基于 Java 或其他）都会在导出数据时通告它支持的一组操作。如果它支持复制的数据，它会通告`COPY`动作;如果它支持从中移动数据，则它会通告`MOVE`操作，依此类推。对于 Swing 组件，源操作通过 [`getSourceActions`](https://docs.oracle.com/javase/8/docs/api/javax/swing/TransferHandler.html#getSourceActions-javax.swing.JComponent-) 方法公布。

当启动拖动时，用户可以通过与拖动手势结合使用的键盘修改器来控制选择哪个源动作进行传输 - 这称为 _ 用户动作 _。例如，默认值（不使用修饰符）通常表示移动操作，按住 Control 键表示复制操作，按住 Shift 和 Control 表示链接操作。用户操作可通过 [`getUserDropAction`](https://docs.oracle.com/javase/8/docs/api/javax/swing/TransferHandler.TransferSupport.html#getUserDropAction--) 方法获得。

用户操作指示首选项，但最终是决定删除操作的目标。例如，考虑一个只接受复制数据的组件。并考虑支持复制和移动的拖动源。仅复制目标的`TransferHandler`可以编码为仅使用 [`setDropAction`](https://docs.oracle.com/javase/8/docs/api/javax/swing/TransferHandler.TransferSupport.html#setDropAction-int-) 方法接受来自源的数据，即使用户已指示移动操作的首选项也是如此。

这项工作发生在`canImport`方法中，目标的`TransferHandler`决定是否接受传入数据。如果源支持，则显式选择`COPY`操作的实现可能如下所示：

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

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

    // check if the source actions (a bitwise-OR of supported actions)
    // contains the COPY action
    boolean copySupported = (COPY & support.getSourceDropActions()) == COPY;
    if (copySupported) {
        support.setDropAction(COPY);
        return true;
    }

    // COPY is not supported, so reject the transfer
    return false;
}

```

以粗体显示的代码段显示了查询源支持的放置操作的位置。如果支持 copy，则调用`setDropAction`方法以确保仅发生复制操作并且方法返回 true。

接下来，我们将看一个使用`setDropAction`显式设置放置操作的演示。