Hi, ich habe 3 JSlider implementiert. der wert aller 3 slider zusammen darf 100 nicht übersteigen. ich überprüfe das alles mit einem changeListener und es passt auch soweit. wenn ich einen wert in einem der 3 slider anklicke und der gemeinsame wert aller 3 würde 100 übersteigen, wird der knob mit slider.setValue() auf den höchsten mögichen wert zurückgesetzt. wenn ich allerdings den knob dragge und auf einer unzulässigen position wieder absetze, wird der wert via setValue zwar zurückgesetzt, der knob bleibt aber auf der unzulässigen position stehen. hat irgendjemand eine ahnung an was das liegen könnte?! mfg
JSlider problem
-
-
Nicht konkret .. aber schon probiert danach ein repaint auszulösen?
-
danke für die schnelle antwort..aber mit dem repaint() gehts leider auch nicht.
-
Poste vielleicht mal den relevanten Code, damit man das mal ansehen kann.
-
Code
Alles anzeigenjavax.swing.event.ChangeListener changeListener_statistic = new javax.swing.event.ChangeListener() { /** Listen to the slider for statistical features. */ public void stateChanged(ChangeEvent e) { JSlider source = (JSlider)e.getSource(); if (!source.getValueIsAdjusting()) { statisticvalue = (int)source.getValue(); System.out.println(statisticvalue); if(checkSlider()) { int value = melodicvalue + rhythmicvalue; statisticslider.setValue(100-value); } } } };
für jeden slider habe ich einen changeListener. die methode checkSlider() schaut einfach ob der gemeinsame wert aller 3 slider > 100 ist und gibt dann true zurück, sonst false. "melodicvalue" und "rhyhtmicvalue" sind die werte der anderen beiden slider.
mfg
-
Habe da etwas recherchiert, und eine Lösung scheint die Verwendung eines BoundesRangeModels zu sein. Folgender Code aktualisiert den JSlider, sobald er den Fokus verliert:
Java
Alles anzeigenimport java.awt.GridLayout; import javax.swing.BoundedRangeModel; import javax.swing.DefaultBoundedRangeModel; import javax.swing.JFrame; import javax.swing.JSlider; public class SliderFrame extends JFrame { private static final long serialVersionUID = 7123905268649335702L; private JSlider valueASlider; private JSlider valueBSlider; private JSlider valueCSlider; public SliderFrame() { setTitle("Slider Demo"); setLayout(new GridLayout(3, 1)); add(valueASlider = new JSlider(new SliderModel())); add(valueBSlider = new JSlider(new SliderModel())); add(valueCSlider = new JSlider(new SliderModel())); pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationByPlatform(true); } private class SliderModel extends DefaultBoundedRangeModel implements BoundedRangeModel { private static final long serialVersionUID = -8168548302661988023L; @Override public synchronized void setValue(int n) { int valueTotal = valueASlider.getValue() + valueBSlider.getValue() + valueCSlider.getValue() - getValue() + n; if (valueTotal <= 100) { super.setValue(n); } } @Override public int getMinimum() { return 0; } @Override public int getMaximum() { return 100; } } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new SliderFrame().setVisible(true); } }); } }
Habe jetzt aber nicht probiert, ob es ursprünglich mit dem ChangeListener den selben Effekt gehabt hätte. Vielleicht wäre eine Lösung, die Komponente dazu zu bringen, dass sie sich neu zeichnet mit dem neuen Wert, wie sie es macht, wenn sie den Fokus verliert. Klingt aber nicht zu elegant .. aber das BoundedRangeModel scheint die richtige Richtung vorzugeben.
Kann da jetzt nicht weiß Gott wieviel Zeit investieren .. aber viel Erfolg noch .. und wenn du eine Lösugn findest, dann poste sie bitte.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!