Java: Zwei abhängige JSlider machen nicht das, was sie sollen

Tidu2k

Mitglied
Hallo!

ich habe mich an meinem Problem hin und her probiert, finde aber keine Lösung für mein Problem.

Es handelt sich um zwei abhängige JSlider A und B.
Startposition von B ist variabel (mal mitten im Wertebereich, mal auf 0 im Wertebereich, wie der Nutzer es sich wünscht).
Slider A und B haben denselben minValue und maxValue.

Slider A soll dann dies übernehmen:
- Wenn sich der Knob von Slider B in Richtung minValue bewegt soll der Knob von Slide A in Richtung maxValue bewegen und umgekehrt.

Mein gescheiterter Versuch ist dieser:
Java:
slider_B.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {
                slider_A.setValue(slider_A.getValue()-1);
            }
});

Mir war klar, dass sich Knob A nur in einer Richtung bewegen wird, egal in welche Richtung Knob B geführt wird.

Habt ihr eine Idee?

Lieben Gruß!
 
Dein jetziger Changelistener macht nur, dass sich bei einer Änderung von Slider_B der Regler von Slider_A um eine Einheit verringert.
Das, was du willst und beschreibst, bekommst du so hin:
Java:
slider_b.addChangeListener( new ChangeListener()
        {
            @Override
            public void stateChanged( ChangeEvent l )
            {
                slider_a.setValue( slider_a.getMaximum()-slider_b.getValue());
            }
        } );
 
Vielen Dank für deine Antwort!

Ich habe eine neue Frage und komme nicht ganz weiter... wieder mal.

Ich habe zwei Java Dateien; bei der ersten werden die Sliders frei gewählt und eine Berechnung wird durchgeführt mit dessen Werten. Wie kann ich diese Werte der anderen Java Datei übergeben, sodass sich ein neuer Frame öffnet und dort das Ergebnis angezeigt wird.

Also wie würde ein konkretes Beispiel aussehen?

Vielen Dank : )
 
Den Weg kannst mit Dependency Injection gehen. Dazu muss die Klasse B einfach nur einen passenden Konstruktor bereit stellen, der von Klasse A aufgerufen werden kann.
Java:
public class ClassA {
    public ClassA() {
         int value = ... // Wert initialisieren, berechnen, ...
         ClassB bInstance = new ClassB(value);
    }
}

public class ClassB {
    public ClassB(int value) {
         System.out.println(value); // hier kann natürlich auch eine andere Ausgabe folgen
    }
}
Alternativ, falls das nicht möglich ist, kann das auch über Setter realisiert werden. Dann muss ClassB den Wert nicht mehr in Konstruktor übergeben bekommen, sondern stellt eine entsprechende Setter-Methode bereit.

PS: Nächstes mal ein neues Thema öffnen 🙂
 
Java:
//Test.java
import javax.swing.*;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().show());
    }

    public void show() {
        JSlider slider = new JSlider();
        Monitor m = new Monitor(slider.getModel());
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(slider);
        frame.pack();
        frame.setVisible(true);

        m.show();
    }
}

Java:
//Monitor.java
import javax.swing.*;

public class Monitor {
    private BoundedRangeModel model;
    private JLabel label;

    public Monitor(BoundedRangeModel model) {
        this.model = model;
        label = new JLabel();
        this.model.addChangeListener(e -> setText(model.getValue()));
    }

    private void setText(int value) {
        label.setText(String.format("Wert: %d", value));
    }

    public void show() {
        JFrame frame = new JFrame("Monitor");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(label);
        frame.setSize(200, 20);
        frame.setVisible(true);
    }
}
 

Zurück
Oben