Folgende Frage. Ich habe eine JTable und einen JSlider. Der Slider soll abhängig von den min/max Werten einer Spalte auch min/max Values bekommen. Problem an der Sache ist, das zu dem Zeitpunkt der Initialisierung von Slider und Tabelle die Daten noch nicht in dem TableModel stehen. Daher war meine Idee alles zu initialisieren und am Ende des “Ladeprozesses” per setMin/setMax die Werte zu setzen.
Aber anscheind ist das irgendwie verboten oder anderweitig krumm:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.basic.BasicSliderUI.calculateTrackBuffer(BasicSliderUI.java:611)
at javax.swing.plaf.basic.BasicSliderUI.calculateGeometry(BasicSliderUI.java:523)
at javax.swing.plaf.basic.BasicSliderUI.paint(BasicSliderUI.java:926)
Wenn ich dagegen die Werte direkt beim Initialisieren angebe klappt alles einwandfrei. Genauso wenn das “neue” Minimum gleich dem alten Minimum ist.
Hat da jemand eine Idee wie man bei JSlidern im Nachhinein/Event die min/max Werte ändert oder was mit die Exception sagen will?
Code an sich ist schwierig auch mit dem Kompilierbarem Beispiel. Aber ich versuchs mal nachvollziehbar zu machen
Die GUI Klasse wo das Element erzeugt wird
rangeSlider = new JSlider(0, 5, 1)
rangeSlider.setPaintTicks(true);
rangeSlider.setPaintLabels(true);
rangeSlider.setPaintTrack(true);
rangeSlider.setMajorTickSpacing(5);
rangeSlider.setMinorTickSpacing(1);
rangeSlider.setFocusable(false);
rangeSlider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
//feuer event falls wert geändert und gebe es aus. funktioniert auch
}
});
und dann die events welche abgefangen werden
//event 1 - siehe oben zum aktualisieren
if(event1) slider.getValue();
//event2 ist das "init" event wenn alle daten im tablemodel stehen
if(event2){
rangeSlider.setMinimum(min);
rangeSlider.setMaximum(max);
//rangeSlider.setMinimum(1); geht auch nicht
//rangeSlider.setMinimum(0); dagegen geht weil gleich dem Ausgangswert
}
Grundsätzlich ist es kein Problem die Grenzen eines Sliders zur Laufzeit zu verändern.
Aus welchem Prozess heraus wird die Änderung angestoßen? (Evlt. darauf achten, dass die Änderung im EDT passiert)
Was steckt hinter dem even2?
Ein PropertyChangeEvent. Angestoßen wird das ganze durch eine Methode in dem Model zur View. Das Model wiederum hat dann besagten PropertyListener/ChangeSupport
Werde nochmal etwas testen da es ein abgeleiteter JSlider ist, welcher zwei Values verarbeiten kann.