1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

JSlider problem

  • jerome
  • 5. Mai 2010 um 18:14
  • Unerledigt
  • jerome
    2
    jerome
    Mitglied
    Punkte
    30
    Beiträge
    4
    • 5. Mai 2010 um 18:14
    • #1

    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

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 5. Mai 2010 um 18:44
    • #2

    Nicht konkret .. aber schon probiert danach ein repaint auszulösen?

  • jerome
    2
    jerome
    Mitglied
    Punkte
    30
    Beiträge
    4
    • 5. Mai 2010 um 19:21
    • #3

    danke für die schnelle antwort..aber mit dem repaint() gehts leider auch nicht.

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 6. Mai 2010 um 00:49
    • #4

    Poste vielleicht mal den relevanten Code, damit man das mal ansehen kann.

  • jerome
    2
    jerome
    Mitglied
    Punkte
    30
    Beiträge
    4
    • 6. Mai 2010 um 11:42
    • #5
    Code
    javax.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);
                        }
                    }
                }    
            };
    Alles anzeigen

    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

  • JohnFoo
    20
    JohnFoo
    Mitglied
    Reaktionen
    61
    Punkte
    4.231
    Beiträge
    761
    • 8. Mai 2010 um 12:39
    • #6

    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
    import 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);
    			}
    		});
    	}
    }
    Alles anzeigen

    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.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung