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显示拖动光标。
接下来,我们展示一个实现了位置敏感拖放的树的演示。