如何编写列表选择监听器

listtable中的选择更改或刚刚更改时,将发生列表选择事件。从实现ListSelectionModelinterface的对象中触发列表选择事件。要获取表的列表选择模型对象,可以使用getSelectionModel方法或 getColumnModel()。getSelectionModel()。

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

本节着眼于两个示例,这些示例显示了如何在选择模型上侦听列表选择事件。 使用列表选择侦听器的示例列出了直接在列表上侦听的示例。

在这两个示例中,可以将选择 Pattern 动态更改为三种受支持的 Pattern 中的任何一种:

  • 单选 Pattern

  • 单间隔选择 Pattern

  • 多间隔选择 Pattern

这是在 List 中运行的 ListSelectionDemo 示例的图片:

ListSelectionDemo 的快照,演示选择 Pattern 和列表选择模型。

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 ListSelectionDemo。另外,要自己编译和运行示例,请查阅example index

  • 选择和取消选择列表中的项目。选择项目所需的鼠标和键盘命令取决于外观。对于 Java 外观,请单击鼠标左键开始选择,使用 Shift 键连续扩展选择,并使用控制键不连续扩展选择。请注意,有两种选择:Lead 和 Anchor。线索是重点项目,锚点是重点项目。当您按 ctrl 键并向上和向下移动时,即使实际选择未更改,线索选择也会触发事件。拖动鼠标将移动或扩展选择,具体取决于列表选择 Pattern。

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

TableListSelectionDemo 的快照,该快照演示选择 Pattern 和列表选择模型。

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

传递到valueChangedListSelectionEvent对象仅表示选择已更改。该事件不包含有关当前选择的信息。因此,此方法查询选择模型以找出当前选择。

列表选择侦听器 API

ListSelectionListener interface

因为ListSelectionListener只有一种方法,所以没有相应的适配器类.

MethodPurpose
valueChanged(ListSelectionEvent)响应选择更改而调用。

ListSelectionEvent API

MethodPurpose
Object getSource()

(* in java.util.EventObject *)
返回引发事件的对象。如果直接在列表上注册列表选择侦听器,则每个事件的源就是列表。否则,源是选择模型。
int getFirstIndex()返回其选择值已更改的第一项的索引。请注意,对于多个间隔选择,保证第一项和最后一项已更改,但它们之间的项目可能没有更改。但是,当您按 ctrl 键并向上或向下移动时,即使实际选择未更改,线索选择也会触发事件。
int getLastIndex()返回其选择值已更改的最后一项的索引。请注意,对于多个间隔选择,保证第一项和最后一项已更改,但它们之间的项目可能没有更改。但是,当您按 ctrl 键并向上和向下移动时,即使实际选择未更改,线索选择也会触发事件。
如果选择仍在更改,则boolean getValueIsAdjusting()返回true。许多列表选择侦听器仅对选择的final状态感兴趣,并且当此方法返回true时可以忽略列表选择事件。

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

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

ExampleWhere DescribedNotes
ListSelectionDemoThis section报告列表上发生的所有列表选择事件。允许用户动态更改选择 Pattern。
TableListSelectionDemoThis section报告表上发生的所有列表选择事件。允许用户动态更改选择 Pattern。
ListDemo如何使用清单侦听单选列表(而不是其选择模型)上的事件。根据是否在列表中选择任何项目,启用和禁用按钮。
SplitPaneDemo如何使用清单侦听单选列表(而不是其选择模型)上的事件。
SimpleTableSelectionDemo如何使用表格在一个表上使用两个不同的列表选择侦听器。一个侦听器侦听表列上的列表选择事件,另一个侦听器侦听表行上的列表选择事件。