Slidery zależne od siebie

Odpowiedz Nowy wątek
2012-12-06 08:21
0

Potrzebuję zrobić 3 slidery, w których suma wartości ma być zawsze taka sama, np 100. Przykład takiego czegoś jest na stronie humble bundle. Chciałbym wiedzieć jak uzupełnić funkcję stateChanged, aby to uzyskać.

Pozostało 580 znaków

2012-12-06 15:04
0

Musisz sprawdzić, który właśnie suwak się zmienił w listenerze, sprawdzić o ile się zmienił, jeśli np. o 40 się zwiększył, to pozostałe suwaki zmniejszasz o 20.


C++ to wyjątkowy język - wysokopoziomowy z niskopoziomowymi mechanizmami, którymi można rozwalić w drobny mak te wysokopoziomowe.

Pozostało 580 znaków

2012-12-06 15:55
0

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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2012-12-06 16:02
0

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.


C++ to wyjątkowy język - wysokopoziomowy z niskopoziomowymi mechanizmami, którymi można rozwalić w drobny mak te wysokopoziomowe.

Pozostało 580 znaków

2012-12-06 16:08
0

Ale te przesuwane programowo suwaki też wygenerują zdarzenie.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2012-12-06 16:11
0

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.


C++ to wyjątkowy język - wysokopoziomowy z niskopoziomowymi mechanizmami, którymi można rozwalić w drobny mak te wysokopoziomowe.
Ja to wiem, ale Ty w pierwszym poście o tym nie wspomniałeś;). - bogdans 2012-12-06 17:55

Pozostało 580 znaków

2012-12-06 16:48
0

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.

edytowany 1x, ostatnio: m4tius, 2012-12-06 16:53

Pozostało 580 znaków

2012-12-06 17:09
0

No to działa dokładnie tak jak zaprogramowałeś. Jeśli chcesz by oba naraz się przesuwały to:

  1. Najpierw oblicz różnicę sumy, tzn difference = 100 - (slider1.value() + slider2.value() + slider3.value());
  2. 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].
  3. Nastepnie dodaj difference1 do slider1 i difference2 do slider2.

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2012-12-06 18:02
0

Heh, wszystko fajnie przy pierwszym sliderze, ale gdy już edytuję pozostałe, to albo wariują z wartościami, albo się blokują. Problem nie jest jakiś nietypowy, ale nie mogę znaleźć jakiegoś przykładu.

Pozostało 580 znaków

2012-12-06 18:11
0

@m4tius Może nie odłączasz listenerów przed wywoływaniem set, o czym pisaliśmy wyżej?


C++ to wyjątkowy język - wysokopoziomowy z niskopoziomowymi mechanizmami, którymi można rozwalić w drobny mak te wysokopoziomowe.

Pozostało 580 znaków

2012-12-06 18:18
0

Mam użyć removeChangeListener?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0