本Java教程适用于JDK 8。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或不推荐选项的信息,请参阅JDK发行说明。
每个拖放源(基于Java或其他方式)在导出数据时都会广告支持的动作集。如果支持数据被复制,它会广告COPY动作;如果支持数据被移动,它会广告MOVE动作,依此类推。对于Swing组件,源动作是通过getSourceActions方法进行广告的。
当拖放启动时,用户可以通过与拖放手势结合使用的键盘修饰符来控制转移的源动作的选择,这称为用户动作。例如,默认情况下(不使用修饰符),通常表示移动操作,按住Control键表示复制操作,同时按住Shift和Control键表示链接操作。用户动作可以通过getUserDropAction方法获得。
用户动作表示了一种偏好,但最终是目标决定放置动作。例如,考虑一个只接受复制数据的组件。再考虑一个支持复制和移动的拖放源。即使用户表示偏好移动操作,复制-only目标的TransferHandler可以编码为只接受来自源的数据,使用setDropAction方法。
这个工作发生在canImport方法中,目标的TransferHandler决定是否接受传入的数据。如果实现显式选择了COPY动作(如果源支持),可能会像这样:
public boolean canImport(TransferHandler.TransferSupport support) {
// 对于演示,我们仅支持拖放(不支持剪贴板粘贴)
if (!support.isDrop()) {
return false;
}
// 我们只导入字符串
if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) {
return false;
}
// 检查源动作(支持动作的按位与)
// 是否包含COPY动作
boolean copySupported = (COPY & support.getSourceDropActions()) == COPY;
if (copySupported) {
support.setDropAction(COPY);
return true;
}
// 不支持COPY,因此拒绝传输
return false;
}
粗体显示的代码片段显示了查询源支持的放置动作的位置。如果支持复制,将调用setDropAction方法以确保只进行复制操作,并且该方法返回true。
接下来我们将看一个显式使用setDropAction设置放置动作的演示。