JList запускает значение valueChanged дважды, когда значение изменяется с помощью мыши

Недавно я столкнулся с ошибкой в ​​java, где JList дважды запускает метод valueChanged() при изменении значения с помощью мыши и только один раз при изменении значения с помощью клавиатуры. Я только что нашел ошибку об этом на веб-сайте Oracle (по-видимому, ошибка более двенадцать лет), и мне интересно, если любой может объяснить мне, почему Oracle решила, что это не дефект (не говоря уже о том, что getValueIsAdjusting() возвращает false при использовании клавиатуры).

Для всех, у кого есть эта проблема, я обнаружил, что просто проверяя, когда getValueIsAdjusting() является ложным, тогда запуск остальной части моего метода обойдется проблемой.

Ответы

Ответ 1

Существует простое объяснение.
Когда вы применяете выделение с помощью мыши, вы выполняете список действий:

1. Нажмите левую кнопку мыши на каком-либо элементе
- список выбирает элемент под мышью и запускает 1-ое событие
- также здесь вы получите getValueIsAdjusting = true, так как мышь еще не выпущена

2. Вы можете перетащить мышь, не отпуская ее, чтобы изменить выбор
- список запустит дополнительное событие для каждого изменения выбора, сделанного
- getValueIsAdjusting будет также верным для каждого из этих событий, так как вы все еще делаете изменения

3. Вы отпустите мышь
- список запустит окончательное событие - операция выбора завершена
- getValueIsAdjusting = false теперь, вы можете делать все, что хотите, с окончательным выбором

Чтобы суммировать - эти дополнительные события запускаются, чтобы вы могли полностью контролировать поведение списка при изменении выбора (точнее, в последовательности изменения выбора). Возможно, вы захотите проигнорировать изменения выбора, когда getValueIsAdjusting = true, так как всегда будет окончательное событие с getValueIsAdjusting = false, которое сообщит вам, что изменения выбора завершены.

Кроме того, когда вы меняете выбор с помощью списка клавиш, список не будет знать, измените ли вы его после первого нажатия клавиши или нет, поэтому getValueIsAdjusting всегда будет false для таких изменений.

Ответ 2

Существует простое решение:

private void jList1 ValueChanged(javax.swing.event.ListSelectionEvent evt) { 

    if (!evt.getValueIsAdjusting()) {//This line prevents double events

    }

}