选择放下动作

每个拖动源(基于 Java 的源或其他基于 Java 的源)都会在导出数据时公布其支持的一组操作。如果支持复制数据,则公告COPY操作;如果它支持从中移出数据,则它将通告MOVE动作,依此类推。对于 Swing 组件,源操作是通过getSourceActions方法发布的。

启动拖动后,用户可以通过与拖动手势结合使用的键盘修饰符来控制选择哪个源动作进行传输,这称为用户动作。例如,默认值(不使用修饰符的情况下)通常表示移动动作,按住 Ctrl 键表示复制动作,同时按住 Shift 和 Control 表示链接动作。可通过getUserDropAction方法执行用户操作。

用户动作表示偏好,但final决定放下动作的是目标。例如,考虑一个仅接受复制数据的组件。并考虑同时支持复制和移动的拖动源。可以将仅复制目标的TransferHandler编码为使用setDropAction方法仅接受来自源的数据,即使用户已指示偏好移动动作也是如此。

这项工作是在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;
}

以粗体显示的代码段显示了查询源支持的放置动作的位置。如果支持复制,则调用setDropAction方法以确保仅进行复制操作,并且该方法返回 true。

接下来,我们将看一个演示,该演示使用setDropAction显式设置放置动作。