Предотвратить запуск ChangeEvent SpinnerNumberModel

Есть ли предпочтительный способ предотвратить запуск событий ChangeEvents в SpinnerNumberModel?

Я мог бы поклясться, что могу где-нибудь вызвать что-то вроде .setIsAdjusting(false), и это отключит событие. Но это не так.

Или мне просто нужно расширить SpinnerNumberModel?


person Lucas    schedule 05.06.2013    source источник
comment
И очевидный вопрос... почему?   -  person Robin    schedule 05.06.2013
comment
Есть ли предпочтительный способ запретить SpinnerNumberModel запускать ChangeEvents? Нет, и вам не нужно этого делать. Кроме нарушения соответствующего JSpinner чего бы вы этим добились? Я поддерживаю вопрос Робина, зачем вам это делать?   -  person Guillaume Polet    schedule 05.06.2013
comment
@Robin Возможно, я просто делаю это совершенно глупо, но у меня есть пара счетчиков, и их значения взаимозависимы. Скажем, ради аргумента, значение одного равно квадрату другого.   -  person Lucas    schedule 05.06.2013
comment
Я не понимаю, как это потребует отключения событий. Я бы сказал, что вам просто нужно событие для обновления второго счетчика при изменении значения первого счетчика.   -  person Robin    schedule 05.06.2013
comment
@Robin Проблема в том, что изменение значения второго счетчика запускает другое событие, которое изменяет ... ага, поэтому события запускаются только тогда, когда значение отличается от текущего значения.   -  person Lucas    schedule 05.06.2013
comment
@Lucas Я вижу здесь 3 варианта: 1) Ваша синхронизация между двумя счетчиками стабильна (установка значения в счетчике 1 устанавливает значение в счетчике 2, который попытается установить то же значение в счетчике 1), поэтому в конечном итоге ChangeEvent не будет срабатывать бесконечно . 2) Всякий раз, когда вы хотите изменить значение в счетчике, вы отключаете прослушиватель этого счетчика, устанавливая флаг (if (updating) return; updating = true; ...) 3) Всякий раз, когда вы хотите изменить значение в счетчике, вы сначала удаляете свой слушатель, а затем добавляете его обратно.   -  person Guillaume Polet    schedule 05.06.2013
comment
@Guillaume Polet это совершенно невозможно с (Property)ChangeListener, потому что BasicSpinnerUI имеет .... и работает вечно, я опубликую SSCCC, пожалуйста, обновите, если вы знаете, как ...   -  person mKorbel    schedule 05.06.2013
comment
@mKorbel Из кода SpinnerNumberModel: if (!value.equals(this.value)) { this.value = (Number)value; fireStateChanged(); }. Поэтому, если значение равно equals, дополнительное событие не будет запущено.   -  person Guillaume Polet    schedule 05.06.2013
comment
@Guillaume Polet, хм, согласен или нет, моя последняя клетка мозга умерла, я совсем запутался, это может быть написано с ошибкой конструктором или использованными методами, у меня есть идея затенения (на самом деле ее нет), у вас есть какой-нибудь пост об этом   -  person mKorbel    schedule 05.06.2013
comment
@GuillaumePolet 1) когда ошибки округления стабильны, не будет бесконечного цикла для двух компонентов. Однако у меня их больше двух, и если я не заблокирую компоненты, цикл легко инициировать. 2) Попробую. 3) Фу   -  person Lucas    schedule 05.06.2013
comment
Я могу сделать это с BoundedRangeModel, но с простой SpinnerXxxModel мне не повезло, поэтому я видел (несколько раз), чтобы удалить все Action/Mouse/(Property)ChangeListeners для редакторов JComponents, а затем добавить собственный XxxListener обратно   -  person mKorbel    schedule 05.06.2013
comment
увидел (источник кода), как JCalendar от Кая Тоедтера реализовал JSpinner, переопределил SpinnerXxxModel, и ограниченный ChangeListener с двумя отдельными флагами   -  person mKorbel    schedule 05.06.2013
comment
@GuillaumePolet спасибо, но затем использовать BoundedRangeModel, действительно отлично подходит для JScrollBar(s)   -  person mKorbel    schedule 05.06.2013