derzeit versuche ich zwei Slider miteinander zu verknüpfen - d.h bei einer Änderung an Slider A soll auch direkt Slider B mitgeändert werden und umgekehrt. (MVC Pattern und Observer Pattern)
Je nach stateChanged() sollte der Wert von dem jeweiligen Slider der gerade geändert wurde gezogen werden, und nicht konstant immer vom "kilometer"-Slider.
Kann mir hier jemand behilflich sein, und erläutern wie ich hier je nach Änderung eines Sliders den aktuellen Wert erhalte? (nicht immer nur den von "kilometers")
Würde mich über Support sehr freuen! Für Rückfragen bin ich gerne zu haben!
PS: Wie bereits ersichtlich habe ich es mittels arg0.getSource() versucht, jedoch erhalte ich hier immer "null" zurück bzw. den "Jslider", was mir ja nichts bringt.
Gruß
Soweit gut, dass du ein Model für deine Daten verwendest.
Jetzt muss dieses Model (als Observable) von deiner UI (als Observer) überwacht werden, sodass die UI automatisch über Werteänderungen im Model benachrichtigt wird.
Du hättest also eine update-Methode in der UI-Klasse, in der sämtliche Komponenten (in deinem Fall die Slider) aktualisiert werden.
die grundsätzliche Struktur besteht bereits - das Problem ist aber folgendes:
Es ist möglich den einen Slider zu bewegen, sodass sich der andere parallel mitbewegt. (Da wir den Wert direkt von view.kilometers.value() holen. Es ist aber nicht möglich den anderen Slider zu bewegen, sodass sich der Slider(kilometer) ebenfalls mitbewegt.
Trivial eigentlich....
Hier mal 'ne schnelle Lösung mit 2 Klassen und dem Observer-Pattern:
Klase View:
Code:
public class View extends JFrame implements ChangeListener, Observer {
private JSlider slider1 = new JSlider(), slider2 = new JSlider();
private Model model = new Model();
public View() {
model.addObserver(this);
slider1.addChangeListener(this);
slider2.addChangeListener(this);
add(slider1, BorderLayout.NORTH);
add(slider2, BorderLayout.CENTER);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public void stateChanged(ChangeEvent e) {
if (e.getSource() instanceof JSlider) {
JSlider source = (JSlider) e.getSource();
model.setValue(source.getValue());
}
}
@Override
public void update(Observable o, Object arg) {
slider1.setValue(model.getValue());
slider2.setValue(model.getValue());
}
public static void main(String[] args) {
new View();
}
}
Klasse Model:
Code:
public class Model extends Observable {
private int value = 0;
public void setValue(int v) {
value = v;
setChanged();
notifyObservers();
}
public int getValue()
{
return value;
}
}
Die UI verändert die Werte im Model, das Model benachrichtigt alle Observer (können beliebig viele sein).
@Fulumbler : Die Thematik (ohne Controller oder mit spielt hier ja keine Rolle) - funktioniert soweit, bis ich einen Faktor einbaue, um die Slider nicht exakt parallel darzustellen. (Sobald ich auf einem Slider beispielsweise die Temperatur in C° und beim anderen die Temperatur in Fahrenheit haben möchte funkioniert dieser Ansatz nicht mehr - mein Problem bleibt bestehen. Die Slider machen dann quasi was sie wollen.