Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不推荐的选项的信息,请参阅JDK发行说明。
有时您有一个复杂的组件,您希望用户能够在其中的某些部分上放置,但在其他部分上不能放置。也许它是一个表格,只允许在某些列中放置数据;或者它是一个树,只允许在某些节点上放置数据。显然,您希望光标提供准确的反馈 - 只有当它在接受拖放的组件的特定部分上时,它才应显示拖放位置。
通过在TransferHandler类的canImport(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显示拖动光标。
接下来,我们展示一个实现了位置敏感拖放的树的演示。