本教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参阅JDK发布说明。
列表选择事件在列表或表格的选择正在改变或刚刚改变时发生。列表选择事件是从实现ListSelectionModel
接口的对象中触发的。要获取表格的列表选择模型对象,可以使用getSelectionModel
方法或getColumnModel().getSelectionModel()
方法。
要检测列表选择事件,可以在适当的列表选择模型对象上注册一个监听器。JList
类还可以让你在列表本身上注册一个监听器,而不是直接在列表选择模型上注册。
本节将介绍两个示例,展示了如何在选择模型上监听列表选择事件。在使用列表选择监听器的示例中,列出了直接在列表上进行监听的示例。
在这两个示例中,你可以动态地将选择模式更改为三种支持的模式之一:
下面是一个在列表中运行的ListSelectionDemo示例的图片:
这是一个在表格中运行的TableListSelectionDemo示例的图片:
您可以在
中找到ListSelectionDemo的完整程序代码,以及在ListSelectionDemo.java
中找到TableListSelectionDemo的完整程序代码。TableListSelectionDemo.java
以下是ListSelectionDemo
中设置选择模型并添加监听器的代码:
...//在这里定义成员变量 JList list; ...//在init方法中: listSelectionModel = list.getSelectionModel(); listSelectionModel.addListSelectionListener( new SharedListSelectionHandler()); ...
这是监听器的代码,它适用于所有可能的选择模式:
class SharedListSelectionHandler implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = (ListSelectionModel)e.getSource(); int firstIndex = e.getFirstIndex(); int lastIndex = e.getLastIndex(); boolean isAdjusting = e.getValueIsAdjusting(); output.append("索引范围 " + firstIndex + " - " + lastIndex + " 的事件; isAdjusting 值为 " + isAdjusting + "; 选中的索引:"); if (lsm.isSelectionEmpty()) { output.append(""); } else { // 查找选中的索引。 int minIndex = lsm.getMinSelectionIndex(); int maxIndex = lsm.getMaxSelectionIndex(); for (int i = minIndex; i <= maxIndex; i++) { if (lsm.isSelectedIndex(i)) { output.append(" " + i); } } } output.append(newline); } }
这个valueChanged
方法显示了事件报告的第一个和最后一个索引,事件的isAdjusting
标志的值,以及当前选中的索引。
注意,事件报告的第一个和最后一个索引表示选择已更改的项的包含范围。如果选择模式是多个间隔选择,则范围内的某些项可能未更改。如果用户仍在操作选择,则isAdjusting
标志为true
,如果用户已完成更改选择,则为false
。
传递给valueChanged
的ListSelectionEvent
对象仅指示选择已更改。事件不包含有关当前选择的任何信息。因此,此方法查询选择模型以确定当前选择。
由于ListSelectionListener
只有一个方法,因此它没有相应的适配器类。
方法 | 用途 |
---|---|
valueChanged(ListSelectionEvent) | 响应选择更改时调用。 |
方法 | 目的 |
---|---|
Object getSource() (在 java.util.EventObject 中) |
返回触发事件的对象。如果直接在列表上注册列表选择监听器,则每个事件的源是列表。否则,源是选择模型。 |
int getFirstIndex() | 返回第一个选定项的索引值已更改。请注意,对于多个区间选择,第一个和最后一个项的更改是保证的,但是它们之间的项可能没有更改。然而,当你按下ctrl键并向上或向下移动时,即使实际选择没有更改,也会触发领先选择导致事件的发生。 |
int getLastIndex() | 返回最后一个选定项的索引值已更改。请注意,对于多个区间选择,第一个和最后一个项的更改是保证的,但是它们之间的项可能没有更改。然而,当你按下ctrl键并向上或向下移动时,即使实际选择没有更改,也会触发领先选择导致事件的发生。 |
boolean getValueIsAdjusting() | 如果选择仍在变化,则返回true 。许多列表选择监听器只对选择的最终状态感兴趣,并且可以在此方法返回true 时忽略列表选择事件。 |
以下表列出了使用列表选择监听器的示例。
示例 | 描述位置 | 备注 |
---|---|---|
ListSelectionDemo |
本节 | 报告在列表上发生的所有列表选择事件。允许用户动态更改选择模式。 |
TableListSelectionDemo |
本节 | 报告在表格上发生的所有列表选择事件。允许用户动态更改选择模式。 |
ListDemo |
如何使用列表 | 监听单选列表上的事件(而不是其选择模型)。根据列表中是否选择了任何项,启用或禁用按钮。 |
SplitPaneDemo |
如何使用列表 | 监听单选列表上的事件(而不是其选择模型)。 |
SimpleTableSelectionDemo |
如何使用表格 | 在一个表格上使用两个不同的列表选择监听器。一个监听器监听表格列的列表选择事件,另一个监听器监听表格行的列表选择事件。 |