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

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

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


person TGP1994    schedule 17.09.2012    source источник
comment
Также см. stackoverflow.com/a/12193333/1076463.   -  person Robin    schedule 17.09.2012
comment
это не ошибка, это фича ;-) Серьезно, хорошо известно (кашель... сам иногда забываю об этом), что большую часть времени для кода приложения имеют значение только уведомления с !getIsValueAdjusting. Кроме того, на что именно вы жалуетесь?   -  person kleopatra    schedule 17.09.2012


Ответы (2)


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

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

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

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

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

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

person Mikle Garin    schedule 17.09.2012

Есть простое решение:

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

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

    }

}                                     
person Eaglechrome    schedule 22.08.2014