本教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发布说明,了解所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
当启用组件的拖放功能时,例如列表,您需要决定如何解释拖放位置。例如,您想限制用户只能替换现有条目吗?您只想允许添加或插入新条目吗?您希望两者都允许吗?为了配置此行为,JList
类提供了setDropMode
方法,支持以下拖放模式。
JList
的默认拖放模式是DropMode.USE_SELECTION
。在此模式下拖动时,列表中的选定项目移动以回显潜在的放置点。在放置时,选定的项目移动到放置位置。此模式是为了向后兼容而提供的,但不建议使用。DropMode.ON
中,列表中的选定项目移动以回显潜在的放置点,但放置时不会影响选定的项目。此模式可用于放置在现有列表项上方。DropMode.INSERT
中,用户只能选择现有列表项之间的空间,或者选择列表中第一个项目之前或最后一个项目之后的空间。不允许选择现有列表项。DropMode.ON_OR_INSERT
是ON
和INSERT
模式的组合。JTree
类提供了相同的拖放模式,JTable
类则提供了更多特定于添加行或列的模式。
为了获取拖放位置,TransferSupport
类提供了getDropLocation
方法,返回拖放发生的精确点。但对于列表组件,索引比像素位置更有用,因此JList
提供了一个特殊的子类,称为JList.DropLocation
。该类提供了getIndex
和isInsert
方法,为您处理了数学计算。
表格、树和文本组件都提供了实现DropLocation
的方法,每个组件的方法都根据其最合适的方式实现。其中,JTable.setDropMode
方法提供了最多的选择。下表展示了四个类的方法:
JList.DropLocation |
JTree.DropLocation |
JTable.DropLocation |
JTextComponent.DropLocation |
---|---|---|---|
isInsert |
getChildIndex |
isInsertRow |
getIndex |
getIndex |
getPath |
isInsertColumn |
getBias |
getRow |
|||
getColumn |
接下来是一个演示,它实现了一个自定义的传输处理程序,用于列表组件,以便它完全参与拖放操作。