文档

Java™教程
隐藏目录
如何编写List Selection监听器
教程:使用Swing创建GUI
课程:编写事件监听器
章节:为常见事件实现监听器

如何编写列表选择监听器

列表选择事件在列表或表格的选择正在改变或刚刚改变时发生。列表选择事件是从实现ListSelectionModel接口的对象中触发的。要获取表格的列表选择模型对象,可以使用getSelectionModel方法或getColumnModel().getSelectionModel()方法。

要检测列表选择事件,可以在适当的列表选择模型对象上注册一个监听器。JList类还可以让你在列表本身上注册一个监听器,而不是直接在列表选择模型上注册。

本节将介绍两个示例,展示了如何在选择模型上监听列表选择事件。在使用列表选择监听器的示例中,列出了直接在列表上进行监听的示例。

在这两个示例中,你可以动态地将选择模式更改为三种支持的模式之一:

下面是一个在列表中运行的ListSelectionDemo示例的图片:

ListSelectionDemo的快照,展示了选择模式和列表选择模型。

试一试: 
  1. 点击“启动”按钮,使用Java™ Web Start运行ListSelectionDemo(下载JDK 7或更高版本)。或者,如果要自己编译和运行示例,请参考示例索引启动ListSelectionDemo示例
  2. 在列表中选择和取消选择项目。选择项目所需的鼠标和键盘命令取决于外观和感觉。对于Java外观和感觉,点击左键开始选择,使用Shift键连续扩展选择,使用Ctrl键不连续扩展选择。注意,有两种类型的选择:Lead和Anchor。Lead是焦点项,Anchor是高亮项。当按住Ctrl键上下移动时,即使实际选择没有改变,lead选择也会触发事件。拖动鼠标移动或扩展选择,具体取决于列表选择模式。

这是一个在表格中运行的TableListSelectionDemo示例的图片:

TableListSelectionDemo的快照,展示了选择模式和列表选择模型。

试一试: 
  1. 点击“启动”按钮使用Java™ Web Start下载JDK 7或更高版本)运行TableListSelectionDemo示例。或者,如果要自己编译和运行示例,请查阅示例索引启动TableListSelectionDemo示例
  2. 在表格中选择和取消选择项目。选择项目所需的鼠标和键盘命令取决于外观。对于Java外观,点击左键开始选择,使用Shift键连续扩展选择,使用Ctrl键不连续扩展选择。注意有两种类型的选择:Lead(领先)和Anchor(锚点)。Lead是焦点项目,Anchor是高亮项目。当按下Ctrl键并向上或向下移动时,即使实际选择没有改变,领先选择也会触发事件。拖动鼠标移动或扩展选择,取决于列表选择模式。

您可以在ListSelectionDemo.java中找到ListSelectionDemo的完整程序代码,以及在TableListSelectionDemo.java中找到TableListSelectionDemo的完整程序代码。

以下是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

传递给valueChangedListSelectionEvent对象仅指示选择已更改。事件不包含有关当前选择的任何信息。因此,此方法查询选择模型以确定当前选择。

列表选择监听器 API

列表选择监听器接口

由于ListSelectionListener只有一个方法,因此它没有相应的适配器类。

方法 用途
valueChanged(ListSelectionEvent) 响应选择更改时调用。

列表选择事件 API

方法 目的
Object getSource()
(java.util.EventObject 中)
返回触发事件的对象。如果直接在列表上注册列表选择监听器,则每个事件的源是列表。否则,源是选择模型。
int getFirstIndex() 返回第一个选定项的索引值已更改。请注意,对于多个区间选择,第一个和最后一个项的更改是保证的,但是它们之间的项可能没有更改。然而,当你按下ctrl键并向上或向下移动时,即使实际选择没有更改,也会触发领先选择导致事件的发生。
int getLastIndex() 返回最后一个选定项的索引值已更改。请注意,对于多个区间选择,第一个和最后一个项的更改是保证的,但是它们之间的项可能没有更改。然而,当你按下ctrl键并向上或向下移动时,即使实际选择没有更改,也会触发领先选择导致事件的发生。
boolean getValueIsAdjusting() 如果选择仍在变化,则返回true。许多列表选择监听器只对选择的最终状态感兴趣,并且可以在此方法返回true时忽略列表选择事件。

使用列表选择监听器的示例

以下表列出了使用列表选择监听器的示例。

示例 描述位置 备注
ListSelectionDemo 本节 报告在列表上发生的所有列表选择事件。允许用户动态更改选择模式。
TableListSelectionDemo 本节 报告在表格上发生的所有列表选择事件。允许用户动态更改选择模式。
ListDemo 如何使用列表 监听单选列表上的事件(而不是其选择模型)。根据列表中是否选择了任何项,启用或禁用按钮。
SplitPaneDemo 如何使用列表 监听单选列表上的事件(而不是其选择模型)。
SimpleTableSelectionDemo 如何使用表格 在一个表格上使用两个不同的列表选择监听器。一个监听器监听表格列的列表选择事件,另一个监听器监听表格行的列表选择事件。

上一页: 如何编写列表数据监听器
下一页: 如何编写鼠标监听器