选择掉落动作

原文: https://docs.oracle.com/javase/tutorial/uiswing/dnd/dropaction.html

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

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

用户操作指示首选项,但最终是决定删除操作的目标。例如,考虑一个只接受复制数据的组件。并考虑支持复制和移动的拖动源。仅复制目标的TransferHandler可以编码为仅使用 setDropAction 方法接受来自源的数据,即使用户已指示移动操作的首选项也是如此。

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

  1. public boolean canImport(TransferHandler.TransferSupport support) {
  2. // for the demo, we will only support drops (not clipboard paste)
  3. if (!support.isDrop()) {
  4. return false;
  5. }
  6. // we only import Strings
  7. if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) {
  8. return false;
  9. }
  10. // check if the source actions (a bitwise-OR of supported actions)
  11. // contains the COPY action
  12. boolean copySupported = (COPY & support.getSourceDropActions()) == COPY;
  13. if (copySupported) {
  14. support.setDropAction(COPY);
  15. return true;
  16. }
  17. // COPY is not supported, so reject the transfer
  18. return false;
  19. }

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

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