To nie jest takie proste. Jeśli suma wartości ma być stała, to musisz przesuwać programowo pozostałe suwaki w trakcie przesuwania ręcznego. Ale te suwaki przesuwane ręcznie też mają listenery.
Druga sprawa, zmniejszenie obu o 20 moze być niemozliwe, bo jeden z nich ma wartość 0 5 większą od jego wartości minimalnej.
Co za problem stworzyć metodę uruchamianą przez listenery, przekazujemy jej eventArg, który zawiera co i o ile się przesunęło. Metoda wtedy za pomocą ifów etc. sprawdzi wcześniej stan innych suwaków i na tej podstawie, odpowiednio zmniejszy/zwiększy ich wartość. Jeśli suwak ma już minimalną wartość jakiś to wcześniej to sprawdzamy i zmniejszamy o całą wartość ten trzeci.
Ważne żeby nie gubić części ułamkowych po dzieleniu.
Po to listenery mają fajną możliwość ich podłączania i odłączania, by z tego skorzystać w odpowiedniej chwili, kiedy nie chcemy reagować na zmiany.
Mam takie coś:
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
slider_1.setValue(100 - source.getValue() - slider_2.getValue());
slider_2.setValue(100 - source.getValue() - slider_1.getValue());
}
});
i analogicznie w pozostałych dwóch sliderach. Niby działa, ale na przesuwany ręcznie slider reaguje tylko 1 i to średnio wygląda. Ten ostatni zmienia dopiero wartość jeśli przekroczona miała by być ta stała suma dla wszystkich, czyli 100, tzn kiedy ten poprzedni jest już ustawiony na 0 lub 100.
No to działa dokładnie tak jak zaprogramowałeś. Jeśli chcesz by oba naraz się przesuwały to:
- Najpierw oblicz różnicę sumy, tzn difference = 100 - (slider1.value() + slider2.value() + slider3.value());
- Następnie podziel tą wartość na dwa składniki (niekoniecznie różne), np difference1 = difference / 3; difference2 = difference - difference1, przy czym musisz zadbać o to by końcowe wartości nie wyleciały poza zakres [0, 100].
- Nastepnie dodaj difference1 do slider1 i difference2 do slider2.