JSlider с 2 источниками данных для обработки событий

У меня есть компонент JSlider на моем фрейме, который постоянно обновляется внешним компонентом (медиаплеером, который время от времени устанавливает новое значение). Я хочу, чтобы слайдер обрабатывал событие stateChanged, только когда я манипулирую слайдером, а не внешним компонентом.

Есть ли способ добиться этого?

1 ответ

Решение

Я бы реализовал свой собственный BoundedRangeModel, таким образом, вы можете добавить дополнительные флаги, которые указывают, должен ли он принимать обновления или нет

ОБНОВЛЕНИЕ с ПРИМЕРОМ

Основная идея заключается в том, чтобы реализовать собственную модель, чтобы вы могли контролировать, когда значение действительно изменяется

public class MyBoundedRangeModel extends DefaultBoundedRangeModel {

    private boolean updatesAllowed;

    public void setUpdatesAllowed(boolean updatesAllowed) {
        this.updatesAllowed = updatesAllowed;
    }

    public boolean isUpdatesAllowed() {
        return updatesAllowed;
    }

    @Override
    public void setMinimum(int n) {
        setUpdatesAllowed(true);
        super.setMinimum(n);
        setUpdatesAllowed(false);
    }

    @Override
    public void setMaximum(int n) {
        setUpdatesAllowed(true);
        super.setMaximum(n);
        setUpdatesAllowed(false);
    }

    @Override
    public void setExtent(int n) {
        setUpdatesAllowed(true);
        super.setExtent(n);
        setUpdatesAllowed(false);
    }

    @Override
    public void setValue(int n) {
        super.setValue(n);
    }

    @Override
    public void setValueIsAdjusting(boolean b) {
        setUpdatesAllowed(true);
        super.setValueIsAdjusting(b);
        setUpdatesAllowed(false);
    }

    @Override
    public void setRangeProperties(int newValue, int newExtent, int newMin, int newMax, boolean adjusting) {        
        if (isUpdatesAllowed()) {
            super.setRangeProperties(newValue, newExtent, newMin, newMax, adjusting);
        }
    }

}

Это позволит вам контролировать изменение свойства "value". Проблема, с которой вы столкнулись, заключается в том, что ВСЕ установленные методы проходят через setRangeProperties метод, поэтому вам нужно решить, что должно быть разрешено для этого. В моем примере, единственный метод, который не контролирует это setValue метод.

В вашем коде вы должны назвать это как-то так...

MyBoundedRangeModel boundedRangeModel = new MyBoundedRangeModel();
slider.setModel(boundedRangeModel);

...

boundedRangeModel.setUpdatesAllowed(true);
slider.setValue(value);
boundedRangeModel.setUpdatesAllowed(false);

Ваш единственный выбор - продлить JSlider сам и переопределить setValue метод прямо аналогичным образом

Другие вопросы по тегам