getValueIsAdjusting具体是做什么的?

7
正如您所知,在jtable中选择一行(通过点击)时,如果不使用!getValueIsAdjusting,选择更改事件将触发两次。如果使用键盘箭头选择行,则不会发生这种情况。要解决此问题,您需要检查getValueIsAdjusting是否返回false。
我的问题是,如果我通过单击选定行,为什么事件会触发两次,而使用键盘箭头则不会? getValueIsAdjusting对此的解决方法是什么?

3
你是否至少阅读了该方法的javadoc以及setValueIsAdjusting()的相关文档?你对这些文档有什么不理解的地方?我认为这些文档已经非常明确了,我没有看到它们可能会更清晰。http://docs.oracle.com/javase/6/docs/api/javax/swing/event/ListSelectionEvent.html#getValueIsAdjusting%28%29 - JB Nizet
嗨!“如果选择正在经历一系列更改,则返回true。”我也不明白为什么。 - Chameleon
2个回答

13

如JB Nizet链接的javadoc所述,getValueIsAdjusting()检查特定事件(一次更改)是否属于链中的一部分,如果是,它将返回true。只有在指定事件是链中的最后一个事件时,它才会返回false

在您的情况下,通过单击选择行实际上会触发两个事件:mouseDownmouseUp事件,并且这两个事件都会发送到您的事件侦听器。 如果您正确实现getValueIsAdjusting()来返回每当值为true时,您将仅对链中的最终事件执行操作,这是松开左鼠标按钮时触发的mouseUp事件。

Java教程包括一个示例来捕获事件,您可以使用它来记录选择事件并自行进行实验。移除event.getValueIsAdjusting()检查上的return以记录触发的每个事件。


好的解释;更多例子请参见这里这里 - trashgod
谢谢您的解释,我现在更清楚了。但还有一个问题,为什么是mouseDown和mouseUp事件,而不是gainFocus和lostFocus事件? - CodeBlue
我认为这实际上与点击表格时首先选择单元格(行和列),然后选择整行有关,因此存在两个连续的行选择。 - jigzat

1
    String interessen[]= {"aaaaaaa", "bbbbbbbb", "ccccccccc", "ddddddd"};

    myList = new JList<>(interessen);

    myList.addListSelectionListener(new ListSelectionListener() {


        @Override
        public void valueChanged(ListSelectionEvent e) {
            if(!e.getValueIsAdjusting())
            System.out.println(myList.getSelectedValue());

        }
    });

上面的代码展示了 getValueIsAdjusting 的作用,如果没有这个方法,事件可能会被调用两次(具体取决于事件)。
在点击 JList 的某个元素后,没有使用 getValueIsAdjusting 的输出结果为: aaaaaaa aaaaaaa
使用了循环后的输出结果为: aaaaaaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接