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
метод прямо аналогичным образом