JSlider wird nicht neugezeichnet

Status
Nicht offen für weitere Antworten.

jperl

Mitglied
hallo,

wieder einmal habe ich ein problem mit swing.

ich will, dass ab einem gewissen zeitpunkt ein gewisser sliderwert nicht unterschritten werden darf.

deshalb habe ich folgenden code:

Code:
		slider.addChangeListener(new ChangeListener()
		{

			@Override
			public void stateChanged(ChangeEvent e)
			{
				if (slider.getValue() < CRVSOMConfig.getStartIt())
				{
					slider.setValue(CRVSOMConfig.getStartIt() + 1);
				}
				sliderLabel.setText(Integer.toString(slider.getValue()));
				repaint();
			}

		});

jedoch wird der slider danach nicht neugezeichnet, d.h. die position des zeigers des sliders stimmt nicht mit dem value überein.
wie kriege ich es hin, dass der slider automatisch neugezeichnet wird?

ist das überhaupt möglich oder ist diese möglichkeit nicht vorgesehen?
gibt es andere bessere möglichkeiten, sprich eine andere gui komponente zu verwenden?
ich würde jedoch ungern die limits des sliders ändern, da ich dann bei einem reset wieder probleme mit der aktualisierung bekomme.

ich hoffe ihr könnt mir helfen.

jperl
 

jperl

Mitglied
André Uhres hat gesagt.:
Versuch's mal so:
Code:
slider.addChangeListener(new ChangeListener() {
    @Override
    public void stateChanged(ChangeEvent e) {
        if (slider.getValue() > CRVSOMConfig.getStartIt()) {
            sliderLabel.setText(Integer.toString(slider.getValue()));
        }
        if (!slider.getValueIsAdjusting()) {
            Runnable sliderValue = new Runnable() {
                @Override
                public void run() {
                    if (slider.getValue() < CRVSOMConfig.getStartIt()) {
                        slider.setValue(CRVSOMConfig.getStartIt() + 1);
                    }
                }
            };
            SwingUtilities.invokeLater(sliderValue);
        }
    }
});

optimal. es funktioniert. :toll:
danke. auf die idee mit einem thread wäre ich nicht gekommen.

jperl
 
G

Gernot_

Gast
Ich habe eine andere Lösung desselben Problems gefunden.
Idee: Beim Loslassen der Maus den Slider aktualisieren
Problem: Wenn ich nur den richtigen Wert auslese und neu hineinschreibe, ändert sich gar nichts.
Lösung: Zuerst einen geringfügig anderen Wert setzen (1 mehr, bei Maximum 1 weniger), dann wieder den richtigen

Im Code ist sld der Slider, für den der Mauslistener registriert wurde:

Java:
public void mouseReleased(MouseEvent e) 
 {
  int wert = sld.getValue();
  if(wert < sld.getMaximum()) 
   sld.setValue(wert+1);
  else
   sld.setValue(wert-1);
  sld.setValue(wert);
 }
 

Gernot_S

Neues Mitglied
So, jetzt bin ich ordentlich registriert (Ich bin der Gernot_ von oben!).
Ich wollte nur noch sagen, dass ich die angegebene Methode mit dem Runnable-Objekt auch probiert habe. Sie hat bei mir aber nicht funktioniert, deshalb werde ich es wie angegeben mit dem Maus-Release-Ereignis machen.

Noch ein paar Fragen an die Java-Profis: Ist diese Funktionalität der JSlider-Komponente beabsichtigt? Oder handelt es sich um einen Fehler in der Swing-Bibliothek? Gibt es einen einfacheren Weg, den Slider zum korrekten Verhalten zu bringen?

Auf Wunsch poste ich hier den Code eines kompletten getesteten Demo-Programms zu diesem Thema.
 

Gernot_S

Neues Mitglied
@Ebenius: Bei Bedienung mit der Tastatur funktioniert ohnehin alles erwartungsgemäß.

Nochmal meine Frage: Weiß jemand, ob dieser "Bug" wirklich einer ist? Wurde das schon an die Java-Entwickler weitergegeben?

Hier ein kleines, aber komplettes Demoprogramm, falls noch jemand weiter damit experimentieren will:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;

// Test für das Swing-Element JSlider
// Gernot Schatzdorfer, 01/2010

// In JSlider gibt es eine Fehlfunktion: Wenn man direkt im Event-Handler für die Slider-Änderung den Wert
// mit setValue korrigiert, wird er zwar korrekt ins Slider-Objekt übernommen, die Zunge bleibt aber am falschen Wert.

// Diese Fehlfunktion gibt es nur beim Ziehen mit der Maus. Wenn man den Slider mit der Tastatur ändert oder mit der
// Maus drüber oder drunter klickt, funktioniert alles normal.

// Lösung in diesem Demoprogramm: Dem Slider einen Maus-Event-Listener zuordnen und beim Loslassen der Maus den
// Wert kurz verändern und dann wieder richtig setzen.

// Im Demoprogramm verwende ich einen Slider mit Bereich von 0 bis 255. Wenn ein Wert 128 übersteigt, soll der Slider
// auf genau 128 springen.

// Dazu kommt noch ein Label zur Anzeige der Sliderwerte.


class Slidertest3                                     // Klasse für das Hauptprogramm
{
 public static void main (String args[]) 
 {
  MeinFenster f = new MeinFenster("Testfenster"); // Hauptprogramm: Nur das Fenster erzeugen 
 }
}

class MeinFenster extends JFrame implements ChangeListener // Klasse für das eingentliche Programmfenster                
{                                                
 JSlider slider1;                                        // Mein Testobjekt
 JLabel anzeige;                                         // Ein Label für die Anzeige des Slider-Wertes
                                               
 MeinFenster(String titel)                        
 {
  super(titel);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  setVisible(true); 
  setSize(400,200);
  slider1 = new JSlider(0,255,64);                       // Slider erzeugen
  anzeige = new JLabel("nix");                           // Label für die Anzeige erzeugen
  setLayout(new GridLayout(0,1));                        // Grid-Layout (Slider und Wertanzeige untereinander)
  add(slider1);
  add(anzeige);
  slider1.addChangeListener(this);                       // Slider-Ereignisauswertung gleich hier   
  
  slider1.addMouseListener(new MausAuswertung());        // Maus-Ereignisauswertung in eigener Klasse
 }

 public void stateChanged(ChangeEvent e)                // Slider-Änderungs-Auswertungs-Listener
 {
  int wert;
  JSlider absender = (JSlider)e.getSource();
  wert = absender.getValue();            
  if(wert>128) absender.setValue(128);                  // Nach Änderung: Wenn > 128 gewaltsam in die Mitte setzen
  wert = absender.getValue();                           // (Ohne die Maus-Released-Funktion unten würde der Slider
  anzeige.setText(" Wert: "+wert);                      //  das aber nicht anzeigen!)
                                                         
 }
 
}

class MausAuswertung implements MouseListener           // Mausereignis-Listener-Klasse
{
 
 
 public void mouseReleased(MouseEvent e)               // Beim Loslassen der Maus auf dem Slider:
 {
  JSlider sld = (JSlider)e.getSource();
  int wert = sld.getValue();
  if(wert < sld.getMaximum()) 
   sld.setValue(wert+1);                               // Wert um 1 erhöhen
  else
   sld.setValue(wert-1);                               // bzw. (bei Maximalwert) um 1 erniedrigen
  sld.setValue(wert);                                  // und wieder richtigstellen
 }

 public void mouseExited(MouseEvent e)  {}             // Die anderen Event-Handler brauche ich nicht
 public void mouseClicked(MouseEvent e) {}
 public void mouseEntered(MouseEvent e) {}
 public void mousePressed(MouseEvent e) {}
}
 

Ebenius

Top Contributor
Ich halte das nicht für eine Fehlfunktion. Innerhalb des Events der auf die Änderung eines Wertes kommt den selben Wert zu ändern ist nunmal unschön. Das geht in vielen Swing-Komponenten schief. Entweder löst man das über eine eigene Modellimplementierung. Oder man führt den Code aus [c]stateChanged[/c] verspätet per [c]SwingUtilities.invokeLater()[/c] aus.

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Frage zum Schieberegler JSlider AWT, Swing, JavaFX & SWT 5
T Java: Zwei abhängige JSlider machen nicht das, was sie sollen AWT, Swing, JavaFX & SWT 4
D Swing JSlider Tip Anzahl AWT, Swing, JavaFX & SWT 3
J JSlider sichtbar AWT, Swing, JavaFX & SWT 7
J Swing JSlider - Form des Reglers AWT, Swing, JavaFX & SWT 6
J JSlider Color Ticks AWT, Swing, JavaFX & SWT 1
J JSlider - MajorTick AWT, Swing, JavaFX & SWT 0
Z JSlider im Modalen-Fenster AWT, Swing, JavaFX & SWT 0
A Swing JLabel/JTextField Inhalt mit JSlider verändern AWT, Swing, JavaFX & SWT 12
A Swing 2 JSlider verknüpfen und mit einem JTextField vergleichen, dann Ausgabe AWT, Swing, JavaFX & SWT 5
A Slider (JSlider?) AWT, Swing, JavaFX & SWT 7
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
A Swing JSlider erscheint doppelt AWT, Swing, JavaFX & SWT 2
K 2D-Grafik Kontrastanpassung über einen JSlider AWT, Swing, JavaFX & SWT 2
A Swing Bestimmte Werte anzeigen JSlider() AWT, Swing, JavaFX & SWT 2
Y Mehrere JSlider verlinken AWT, Swing, JavaFX & SWT 6
M JSlider-Wert ändern, ohne ein ChangeEvent auszulösen AWT, Swing, JavaFX & SWT 4
C Aussehen von JSlider ändern AWT, Swing, JavaFX & SWT 7
D Swing jSlider soll selber weiterwandern, je nach zeit der musik AWT, Swing, JavaFX & SWT 5
D JSlider und Textfeld AWT, Swing, JavaFX & SWT 2
C Swing Tickspacing in JSlider AWT, Swing, JavaFX & SWT 3
C Swing Mehrere JSlider sollen aufeinander reagieren AWT, Swing, JavaFX & SWT 4
Y JSlider Wert auslesen (Kategorien) AWT, Swing, JavaFX & SWT 2
T jSlider-Value als Float in jLabel ausgeben AWT, Swing, JavaFX & SWT 2
O Swing JSlider mit doppelter Value AWT, Swing, JavaFX & SWT 6
F JSlider Design ändern AWT, Swing, JavaFX & SWT 6
D Swing JSlider AWT, Swing, JavaFX & SWT 11
B JSlider - Wert am Mouszeiger anzeigen lassen AWT, Swing, JavaFX & SWT 6
E JSlider synchron halten AWT, Swing, JavaFX & SWT 4
J Swing jSlider nur auf bestimmte werte beschränken AWT, Swing, JavaFX & SWT 15
X Audio Player: Fenster mit Play/Stop-Button erstellen, mit JSlider Lautstärke ändern AWT, Swing, JavaFX & SWT 6
R JSlider AWT, Swing, JavaFX & SWT 9
M Swing JSlider, Popup-Box AWT, Swing, JavaFX & SWT 3
J JSlider mit Double Werten AWT, Swing, JavaFX & SWT 5
J JSlider auf JTextPane? AWT, Swing, JavaFX & SWT 2
M Jslider Beschriftung AWT, Swing, JavaFX & SWT 6
R JLabel und JSlider dynamisch erzeugen? AWT, Swing, JavaFX & SWT 3
E jSlider und ChangeListener AWT, Swing, JavaFX & SWT 2
S JSlider Track Breite und Farbe AWT, Swing, JavaFX & SWT 2
T Swing JSlider und Adjustment-Listener wollen nicht so recht AWT, Swing, JavaFX & SWT 2
O JSlider - wie unterscheide ich mit Maus verändert und durch setValue verändert. AWT, Swing, JavaFX & SWT 16
T JSlider: ChangeListener löst dreimal aus? AWT, Swing, JavaFX & SWT 4
B JSlider in JCombobox AWT, Swing, JavaFX & SWT 9
J Einen JSlider ähnlich wie in OO3 AWT, Swing, JavaFX & SWT 5
G JSlider in Applet AWT, Swing, JavaFX & SWT 4
K Unterschiedliches Aussehen der JSlider? AWT, Swing, JavaFX & SWT 4
I Listener für einen JSlider AWT, Swing, JavaFX & SWT 1
G beschriftung von JSlider AWT, Swing, JavaFX & SWT 7
H JSlider mit 2 Werten AWT, Swing, JavaFX & SWT 7
L JSlider Beschriftung AWT, Swing, JavaFX & SWT 1
A JSlider umdrehen AWT, Swing, JavaFX & SWT 15
D JSlider und JMF player verbinden AWT, Swing, JavaFX & SWT 6
J JSlider regaiert unter Java 1.6 nicht mehr AWT, Swing, JavaFX & SWT 7
N JSlider: Kosmetik - snapToTicks AWT, Swing, JavaFX & SWT 3
T JComponents abändern/modifizieren z.b. JSlider AWT, Swing, JavaFX & SWT 2
N Nicht linearer JSlider! AWT, Swing, JavaFX & SWT 4
T JSlider getValue() erst nach dem Loslassen des Mauszeigers AWT, Swing, JavaFX & SWT 3
Z JSlider-Knob wenden AWT, Swing, JavaFX & SWT 8
L JSlider stumm geworden? AWT, Swing, JavaFX & SWT 2
I JSlider - klick ignorieren AWT, Swing, JavaFX & SWT 4
I JSlider-Schieberegler AWT, Swing, JavaFX & SWT 7
T JSlider Schiebereglerbild ändern AWT, Swing, JavaFX & SWT 4
U JSlider - Probleme bei der Darstellung AWT, Swing, JavaFX & SWT 3
H ChangeListener für JSlider AWT, Swing, JavaFX & SWT 6
P JSlider automatisch bewegen AWT, Swing, JavaFX & SWT 3
G JSlider AWT, Swing, JavaFX & SWT 2
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
G JavaFX LineChart Datenpunkte Markierung wird abgeschnitten AWT, Swing, JavaFX & SWT 1
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
S Next_Button wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 6
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
J setOnCloseRequest wird nicht ausgelöst AWT, Swing, JavaFX & SWT 3
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
B JavaFX Bei Scenen-Wechsel im primaryStage wird aktuelle Fenstergröße nicht mit übernommen AWT, Swing, JavaFX & SWT 16
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben