Для наименьшего примера у меня есть три элемента Swing JComponent
, которые должны взаимодействовать друг с другом: a JSlider
и два JTextFields
. JSlider
идет от 0 до 50, один из JTextFields показывает значение JSlider, а второе JTextField
показывает процент от общего значения (т. Е. 2 в JSlider
будет обновлять 4% во втором JTextField
).Несколько взаимозависимых JComponents без рекурсивной петли
Изменение любого из трех элементов должно обновлять все остальные. Таким образом, ChangeEvent
в JSlider
должен вызывать setText()
событий в JTextFields
. Однако setText()
запускает ActionEvents
в TextFields
, который должен в этом случае вызвать изменение значения для JSlider
.
Я занимался этой проблемой с помощью «освежающего» флага boolean
, где булевое будет проверяться перед обработкой ActionEvent
/ChangeEvent
. но я хотел бы знать, есть ли более программный или более чистый способ предотвращения цикла ActionEvent
/ChangeEvent
.
Буду признателен за любые идеи!
Редактировать
Я пытаюсь сделать эту работу с информацией гистограммы, где процентные значения не будут точно соответствовать значению ползунков (т.е. будут ошибки округления). Предлагаемый метод SpinSliders опирается на способ setText()
, способный «оседать» на конечном значении. Другими словами, если значение, введенное в setText()
, совпадает с текстом, который он уже имеет, он не запускает ActionEvent
, эффективно заканчивая цикл. Если округление выключено, setValue()
JSlider
и setText()
JTextField
никогда не достигнут «равновесного» состояния из-за округления. Надеюсь, это кратко описывает проблему.
Вы можете вычислить новое значение в слушателе каждого компонента. Это вычисление является простым в ползунке и текстовом поле с абсолютным значением. В текстовом поле в процентах вам нужно будет сделать продукт. Затем вы можете вызвать функцию «update», которая обновляет все три поля (да, даже тот, который только что был изменен). Поэтому убедитесь, что у вас есть средства для распознавания программных и инициированных пользователем событий в слушателях изменений. Другой вариант - использовать [шаблон посредника] (http://en.wikipedia.org/wiki/Mediator_pattern) –
['SpinSlider'] (http://stackoverflow.com/a/6067986/230513) может быть полезным пример. – trashgod
@MisterSmith Я искал программные и инициированные пользователем события для слушателей изменений, но я вышел пустым. Это различие будет иметь наибольший смысл, но в Java API нет ничего, что я мог бы найти. – ddukki