2013-12-03 2 views
1

Для наименьшего примера у меня есть три элемента 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 никогда не достигнут «равновесного» состояния из-за округления. Надеюсь, это кратко описывает проблему.

+1

Вы можете вычислить новое значение в слушателе каждого компонента. Это вычисление является простым в ползунке и текстовом поле с абсолютным значением. В текстовом поле в процентах вам нужно будет сделать продукт. Затем вы можете вызвать функцию «update», которая обновляет все три поля (да, даже тот, который только что был изменен). Поэтому убедитесь, что у вас есть средства для распознавания программных и инициированных пользователем событий в слушателях изменений. Другой вариант - использовать [шаблон посредника] (http://en.wikipedia.org/wiki/Mediator_pattern) –

+1

['SpinSlider'] (http://stackoverflow.com/a/6067986/230513) может быть полезным пример. – trashgod

+0

@MisterSmith Я искал программные и инициированные пользователем события для слушателей изменений, но я вышел пустым. Это различие будет иметь наибольший смысл, но в Java API нет ничего, что я мог бы найти. – ddukki

ответ

1

SpinSlider может быть полезной отправной точкой. Поскольку вы должны иметь возможность «поселиться» по окончательному значению, используйте getValueIsAdjusting() для обновления после того, как будет доступно окончательное значение.