本教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
请参阅Java语言变化以了解Java SE 9及后续版本中的更新语言功能的摘要。
请参阅JDK发布说明以了解所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
下面的演示,LocationSensitiveDemo
,显示了一个已经配置为支持在除了一个名为“names”(或其后代)之外的任何节点上进行拖放的JTree
。使用框架顶部的文本字段作为拖动源(每次从那里拖动时,它会自动递增字符串编号)。
树下面的一个组合框允许您切换显示放置位置的行为。Swing的默认行为是仅在区域可以接受拖放时显示放置位置。您可以覆盖此行为以始终显示放置位置(即使区域无法接受拖放),或者从不显示放置位置(即使区域可以接受拖放)。
LocationSensitiveDemo
(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参阅示例索引。
的LocationSensitiveDemo
canImport
方法如下所示:
public boolean canImport(TransferHandler.TransferSupport info) { // for the demo, we will only support drops (not clipboard paste) if (!info.isDrop()) { return false; } String item = (String)indicateCombo.getSelectedItem(); if (item.equals("始终")) { info.setShowDropLocation(true); } else if (item.equals("从不")) { info.setShowDropLocation(false); } // we only import Strings if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) { return false; } // fetch the drop location JTree.DropLocation dl = (JTree.DropLocation)info.getDropLocation(); TreePath path = dl.getPath(); // we do not support invalid paths or descendants of the names folder if (path == null || namesPath.isDescendant(path)) { return false; } return true; }
粗体显示的第一个代码片段修改了拖放位置的反馈机制。如果选择了"始终",则始终显示拖放位置。如果选择了"从不",则不显示拖放位置。否则,使用默认行为。
粗体显示的第二个代码片段包含确定树是否接受数据的逻辑。如果路径无效或不是名称路径(或其后代),则返回false,导入将不被接受。