"nichts einfacher als das" - dachte... (вставьте имя :-)
По сути, все такие расширенные функции должны быть реализованы в модели: для JSlider это BoundedRangeModel. Реализуйте/расширьте и примените его значение для соблюдения «комбинированного» макс. Что-то типа
public static class LimitedBoundedRangeModel extends DefaultBoundedRangeModel {
BoundedRangeModel limit;
public LimitedBoundedRangeModel(BoundedRangeModel limit) {
this.limit = limit;
}
/**
* @inherited <p>
*/
@Override
public void setRangeProperties(int newValue, int newExtent, int newMin,
int newMax, boolean adjusting) {
if (limit != null) {
int combined = newValue + limit.getValue();
if (combined > newMax) {
newValue = newMax - limit.getValue();
}
}
super.setRangeProperties(newValue, newExtent, newMin, newMax, adjusting);
}
}
// use
LimitedBoundedRangeModel firstModel = new LimitedBoundedRangeModel(null);
LimitedBoundedRangeModel secondModel = new LimitedBoundedRangeModel(firstModel);
firstModel.limit= secondModel;
JSlider first = new JSlider(firstModel);
JSlider second = new JSlider(secondModel);
Несмотря на простоту (только две зависимости) и грубость (прямая двунаправленная связь) и, как таковую, не очень пригодную для использования в дикой природе, она должна, по крайней мере, работать... но не работает - один из тех сюрпризов, которые время от времени поражают меня; -) Визуальная проблема - это положение большого пальца:
- комбинированный максимум соблюдается при щелчке справа от большого пальца: большой палец никогда не пересекает порог
- при перетаскивании большой палец можно перемещать везде, чего можно было бы ожидать, поскольку пользовательский интерфейс не знает о настройке модели - он знает только «локальный» максимум
- в конце перетаскивания большой палец остается в этом недопустимом положении ... что пахнет ошибкой, так как теперь большой палец не синхронизирован с моделью
Причина этого неправильного поведения заключается в том, что changeListener в Handler: он не пересчитывает положение своего большого пальца при перетаскивании (что нормально). Тонкая ошибка заключается в том, что внутренний флаг перетаскивания сбрасывается только после сброса свойства настройки модели, поэтому отсутствует самое последнее уведомление об окончательном значении...
Обходной путь заключается в том, чтобы вызвать срабатывание дополнительного события changeEvent, если флаг настройки изменяется с true на false.
boolean invoke =
(adjusting != getValueIsAdjusting()) && !adjusting;
super.setRangeProperties(newValue, newExtent, newMin, newMax, adjusting);
if (invoke) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
fireStateChanged();
}
});
}
person
kleopatra
schedule
20.09.2011
MultiSlider
? - person trashgod   schedule 19.09.2011