如何编写列表选择监听器
当list或table中的选择更改或刚刚更改时,将发生列表选择事件。从实现ListSelectionModelinterface的对象中触发列表选择事件。要获取表的列表选择模型对象,可以使用getSelectionModel
方法或 getColumnModel()。getSelectionModel()。
要检测列表选择事件,请在适当的列表选择模型对象上注册一个侦听器。 JList
类还使您可以选择在列表本身上注册侦听器,而不是直接在列表选择模型上注册。
本节着眼于两个示例,这些示例显示了如何在选择模型上侦听列表选择事件。 使用列表选择侦听器的示例列出了直接在列表上侦听的示例。
在这两个示例中,可以将选择 Pattern 动态更改为三种受支持的 Pattern 中的任何一种:
-
单选 Pattern
-
单间隔选择 Pattern
-
多间隔选择 Pattern
这是在 List 中运行的 ListSelectionDemo 示例的图片:
Try this:
-
单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 ListSelectionDemo。另外,要自己编译和运行示例,请查阅example index。
-
选择和取消选择列表中的项目。选择项目所需的鼠标和键盘命令取决于外观。对于 Java 外观,请单击鼠标左键开始选择,使用 Shift 键连续扩展选择,并使用控制键不连续扩展选择。请注意,有两种选择:Lead 和 Anchor。线索是重点项目,锚点是重点项目。当您按 ctrl 键并向上和向下移动时,即使实际选择未更改,线索选择也会触发事件。拖动鼠标将移动或扩展选择,具体取决于列表选择 Pattern。
这是在表中运行的 TableListSelectionDemo 示例的图片:
Try this:
-
单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 TableListSelectionDemo。另外,要自己编译和运行示例,请查阅example index。
-
选择和取消选择表中的项目。选择项目所需的鼠标和键盘命令取决于外观。对于 Java 外观,请单击鼠标左键开始选择,使用 Shift 键连续扩展选择,并使用控制键不连续扩展选择。请注意,有两种选择:Lead 和 Anchor。线索是重点项目,锚点是重点项目。当您按 ctrl 键并向上或向下移动时,即使实际选择未更改,线索选择也会触发事件。拖动鼠标将移动或扩展选择,具体取决于列表选择 Pattern。
您可以在ListSelectionDemo.java中找到 ListSelectionDemo 的整个程序,并在TableListSelectionDemo.java中找到 TableListSelectionDemo 的整个程序。
这是来自ListSelectionDemo
的代码,用于设置选择模型并向其添加侦听器:
...//where the member variables are defined
JList list;
...//in the init method:
listSelectionModel = list.getSelectionModel();
listSelectionModel.addListSelectionListener(
new SharedListSelectionHandler());
...
这是侦听器的代码,它适用于所有可能的选择 Pattern:
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("Event for indexes "
+ firstIndex + " - " + lastIndex
+ "; isAdjusting is " + isAdjusting
+ "; selected indexes:");
if (lsm.isSelectionEmpty()) {
output.append(" <none>");
} else {
// Find out which indexes are selected.
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
标志的值以及当前选择的索引。
请注意,事件报告的第一个索引和最后一个索引指示选择已更改的项 Object 包含范围。如果选择 Pattern 是多间隔选择,则该范围内的某些项目可能未更改。如果用户仍在操纵选择,则isAdjusting
标志为true
,如果用户完成更改选择则为false
。
传递到valueChanged
的ListSelectionEvent
对象仅表示选择已更改。该事件不包含有关当前选择的信息。因此,此方法查询选择模型以找出当前选择。
列表选择侦听器 API
ListSelectionListener interface
因为ListSelectionListener
只有一种方法,所以没有相应的适配器类.
Method | Purpose |
---|---|
valueChanged(ListSelectionEvent) | 响应选择更改而调用。 |
Method | Purpose |
---|---|
Object getSource() | |
(* in java.util.EventObject *) | 返回引发事件的对象。如果直接在列表上注册列表选择侦听器,则每个事件的源就是列表。否则,源是选择模型。 |
int getFirstIndex() | 返回其选择值已更改的第一项的索引。请注意,对于多个间隔选择,保证第一项和最后一项已更改,但它们之间的项目可能没有更改。但是,当您按 ctrl 键并向上或向下移动时,即使实际选择未更改,线索选择也会触发事件。 |
int getLastIndex() | 返回其选择值已更改的最后一项的索引。请注意,对于多个间隔选择,保证第一项和最后一项已更改,但它们之间的项目可能没有更改。但是,当您按 ctrl 键并向上和向下移动时,即使实际选择未更改,线索选择也会触发事件。 |
如果选择仍在更改,则boolean getValueIsAdjusting() | 返回true 。许多列表选择侦听器仅对选择的final状态感兴趣,并且当此方法返回true 时可以忽略列表选择事件。 |
使用列表选择监听器的示例
下表列出了使用列表选择侦听器的示例。
Example | Where Described | Notes |
---|---|---|
ListSelectionDemo | This section | 报告列表上发生的所有列表选择事件。允许用户动态更改选择 Pattern。 |
TableListSelectionDemo | This section | 报告表上发生的所有列表选择事件。允许用户动态更改选择 Pattern。 |
ListDemo | 如何使用清单 | 侦听单选列表(而不是其选择模型)上的事件。根据是否在列表中选择任何项目,启用和禁用按钮。 |
SplitPaneDemo | 如何使用清单 | 侦听单选列表(而不是其选择模型)上的事件。 |
SimpleTableSelectionDemo | 如何使用表格 | 在一个表上使用两个不同的列表选择侦听器。一个侦听器侦听表列上的列表选择事件,另一个侦听器侦听表行上的列表选择事件。 |