2 JSlider Listener temporär deaktivieren

Guten Tag,
ich hab 2 JSlider, auf/in denen jeweils ein ChangeListener cl ChangeEvent e liegt. Ändert der User einen JSlider, wird ein ChangeEvent ausgelöst. Wenn sich der Wert eines JSlider ändert, soll sich auch der Wert des anderen JSlider ändern. Wenn ich den Wert des anderen JSlider mit js.setValue((int) value); ändere, wird wieder ein ChangeEvent ausgelöst. Stichwort: Zyklen.
Wie kann ich den Wert eines JSlider ändern, ohne das dies den anderen JSlider betrifft?
Ich weiß nicht, wonach ich suchen soll.
Grüße

‘java listener infinite loop’ dürfte als Suche gehen,

im Forum auch schon paar mal, vielleicht früher im alten Forum…,
mit boolean-Flag ausschalten dürfte die Standardlösung sein wie ich in den ersten Suchergebnissen, schön freilich nicht,

evtl. noch Richtung Untersuchung Quelle des Events, in Swing nicht so schön, vielleicht StackTrace anschauen…,

Wie SlaterB schon sagte: Das klassische Muster ist, ganz straightforward

class GUI
{
    private void isAdjustingSlider = false;

    void sliderChangedA(ChangeEvent e)
    {
        if (isAdjustingSlider) return; // Ignore this
        isAdjustingSlider = true;
        sliderB.setValue(123);
        isAdjustingSlider = false;
    }

    void sliderChangedB(ChangeEvent e)
    {
        if (isAdjustingSlider) return; // Ignore this
        isAdjustingSlider = true;
        sliderA.setValue(123);
        isAdjustingSlider = false;
    }
}

Ausgefeiltere Möglichkeiten gibt’s immer (Sowas wie getValueIsAdjusting ist allerdings nur bedingt anwendbar). Der Idealfall wäre, dass das ganze “stabil” ist: Wenn sich ein Wert im Slider A z.B. auf “42” ändert, dann ändert er sich im Slider B auf “24”, und das bewirkt, dass er in Slider A auf “42” gesetzt wird - was dann aber eben KEINEN ChangeEvent mehr auslöst. Etwas pseudospezifischer: Wenn die Abbildung der Sliderwerte eine Bijektive Funktion ist, sollte es kein Problem geben. Aber das ist nicht immer der Fall…

Hallo ihr Zwei,
“bijektive Funktion” daran hab ich auch schon gedacht, zum Testen hatte ich einfach mal: .setValue(Math.random()*100);
aber rundungsbedingt (rechnen mit Double, umwandeln nach Int) wird wahrscheinlich die Eigenschaft Bijektivität verletzt,

https://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html

        JSlider source = (JSlider)e.getSource();
        if (!source.getValueIsAdjusting()) {
            int fps = (int)source.getValue();
            ...
        }    
    }```

i don't know, wann dieses isValueIsAdjusting gesetzt wird,
also kann ich JSlider nicht einfach sagen, bitte nachfolgendes Event ignorieren?

Edit: Ich lasse das besser, mit zufälligen Werten funktioniert es, wenn ein JSlider von den anderen "abhängig" ist, treten komische Effekte auf. Der Wert des anderen JSlider lässt sich auch einmal nicht mehr ändern usw. (springt zurück usw.)

Wie gesagt, “getValueIsAdjusting” ist eher etwas, was “intern” verwendet wird. Insbesondere wird das flag auch “von Swing selbst” gesetzt - und zwar speziell wenn man den Slider-Knopf mit der Maus zieht: Solange man die Maus nicht losläßt, ist das flag gesetzt. Erst wenn man die Maus losläßt, kommt ein Event, wo das flag NICHT gesetzt ist. Das dient insbesondere dem Zweck, dass man nicht 1000 Updates machen muss, nur weil ein Benutzer mit Parkinson den Slider bedient. Mit diesem Flag sollte man also nicht rum-hacken. Ein eigenes flag ist hier die nächstliegende Lösung.

Danke, mein Beitrag ist leider verschwunden. Aaaber:
Ohne flag und mit random friert die GUI ein, ein Zeichen für loop,
Mit flag und random funktioniert’s, wie es soll (der andere JSlider springt hin und her),
Mit flag und berechnetem Wert funktioniert es wieder nicht, der andere JSlider harkt, dessen Wert lässt sich nicht verstellen.

Programmcode (ohne Doku):

                @Override
                public void stateChanged(ChangeEvent e) {
                    jl2.setText("" + js.getValue());
                    gui.updateGUI(null);
                }
            });

        private void updateGUI(PropertyChangeEvent evt) {
            setVals1();
            setVals2();
            printGUI();
            setJs(); // wichtig
        }

        private void setVals1() {
            vals1[0] = lvs.get(1).getValue();
            vals1[1] = lvs.get(2).getValue();
            vals1[2] = lvs.get(4).getValue();
            vals1[3] = lvs.get(0).getValue();
            vals1[4] = lvs.get(6).getValue();
            vals1[5] = lvs.get(3).getValue();
            vals1[6] = lvs.get(5).getValue();
        }

        private void setVals2() {
            vals2[0] = vals1[1] / vals1[3] + vals1[0];

            vals2[1] = Math.abs(vals2[0] - vals1[2]);
            vals2[2] = vals2[0] - vals2[1];
            vals2[3] = vals2[0] + vals2[1];
            vals2[4] = (vals2[0] - vals2[1] - vals1[0]) * vals1[3];
            vals2[5] = (vals2[0] + vals2[1] - vals1[0]) * vals1[3];

            vals2[6] = vals1[4];
            vals2[7] = vals1[1] * (1 - vals1[4] / 100.0);
            vals2[8] = vals1[1] * (1 + vals1[4] / 100.0);
            vals2[9] = vals2[7] / vals1[3] + vals1[0];
            vals2[10] = vals2[8] / vals1[3] + vals1[0];

            vals2[13] = vals1[1] + vals1[6] / vals1[5];
            vals2[12] = (vals2[13] - vals1[1]) * vals1[5];
            vals2[11] = vals2[13] / vals1[1] * 100.0 - 100.0;
            vals2[14] = vals2[13] / vals1[3] + vals1[0];

        }

        private void printGUI() {
            jta.setText("");
            String[] texte = new String[]{
                "viele Labels"
            };
            double da[] = beautify(vals2);
            int i = 0;
            int j = 0;
            while (i < texte.length) {
                if (texte**.isEmpty()) {
                    jta.append("
");
                    i++;
                } else {
                    jta.append(texte** + da[j] + "
");
                    i++;
                    j++;
                }
            }
        }

        private void setJs() {
            lvs.get(5).setValue((int) vals2[11]); // vals2[11] ist ein berechneter Wert von JSlider und löst stateChanged aus
        }```

Das sieht nach Beta-Code aus. Kann man daraus was compilerbares machen, damit man das Problem nachvollziehen kann?

Theoretisch/praktisch schon, aber theoretisch müsste ich alles posten, ungefähr 500 Zeilen, und auch mit sinnvollen Werten füllen, damit das nicht sofort “ausschlägt”. Praktisch berechnet das Tool Börsenkurse, weil das meine Bank glaube ich nicht anbietet, und das wiederum möchte ich nicht veröffentlichen.^^

Trade-off: Ich versuche, das Probl. zu isolieren/reproduzieren und poste morgen (nicht heute) noch mal ein KSKB.

Edit: Falls du damit meintest, ob du aus dem obigen Code etwas compilierbares machen kannst: NEIN, das war nicht meine Intention, da hab ich mich verrannt. Du müsstest raten, wofür vals1 0 bis 6 (Input) und vals2 0 bis 14 (Output) stehen, das geht so ohne Weiteres insiderwissen nicht.

Ich wünsche dir trotzdem einen schönen Abend, wird schon klappen. :stumm:

das Thema scheint mit diesem Posting schließenswert,
riecht eh nach einem gewissen gesperrten Nutzer inklusive IP-Bereich,

dass lauter merkwürdige neue Nutzer nur zufällig aus diesem Bereich kommen sollten und niemand sonst,
das kann ja kaum sein,
zum Thema ist grundsätzlich genug gesagt, die Suchergebnisse alleine klären alles