Java ChangeListener срабатывает несколько раз

У меня есть простой прослушиватель изменений на слайдере. Кто-нибудь может объяснить, почему он срабатывает 3 раза, когда я нажимаю на новую позицию. Прежде чем я напишу код, чтобы где-то сохранить предыдущее значение, чтобы увидеть, действительно ли оно изменилось, я хотел бы узнать, есть ли другой способ выяснить это. Первый тигр показывает его таким, каким он был, следующий показывает новое значение, последний повторяет новое значение.

        slider_1 = new JSlider();
    slider_1.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent arg0) {
            if (fullyInitialized == 1) {
                if (comboBox_1.getSelectedIndex() < 1) {
                    SendData2Device(1);     
                }       
            }
        }
    });
    slider_1.setOrientation(SwingConstants.VERTICAL);

person gbarnabic    schedule 02.01.2013    source источник
comment
возможный дубликат ручки JSlider не обновляется (базовая Java). Внутри ChangeListener вы должны проверить if (!slider.getValueIsAdjusting()), так как этот метод вызывается при изменении значения, и, таким образом, если значение изменяется 10 раз, оно будет вызываться 10 раз.   -  person David Kroukamp    schedule 02.01.2013


Ответы (2)


Вам нужно проверить, является ли изменение корректировкой значения.

Ссылка на полное руководство: http://docs.oracle.com/javase/tutorial/uiswing/components/slider.html

Но вот важный момент:

public void stateChanged(ChangeEvent e) {
    JSlider source = (JSlider)e.getSource();
    if (!source.getValueIsAdjusting()) {
        // Do what needs to occur here.
    }
}

По сути, когда getValueIsAdjusting() возвращает false, пользователь перестал перемещать ползунок.

person Erik Nedwidek    schedule 02.01.2013
comment
Внутри если, где вы сказали, я положил то, что нужно сделать. У меня есть System.out.println(sliderValue);, но он печатается дважды. Я хочу, чтобы он печатался только один раз! Как я могу это сделать? - person J86; 04.04.2013

В цепочке ChangeListener есть 3 события, а именно mouseDown, mouseUp и само изменение.

Вы можете воздействовать на событие после завершения изменения, используя getValueIsAdjusting:

JSlider source = (JSlider)e.getSource();
if (!source.getValueIsAdjusting()) {
   ...
} 

См.: Как написать прослушиватель изменений

person Reimeus    schedule 02.01.2013