2012-09-24 11 views
8

Ich habe einige Probleme mit der JSlider Klasse - speziell mit Tick Etiketten.Ist das ein Fehler in JSlider?

Das erste Mal, dass ich setMajorTickSpacing und setMinorTickSpacing verwende, funktioniert alles wie erwartet. Nachfolgende Aufrufe an setMajorTickSpacing aktualisieren jedoch die Ticks, aber nicht die Labels. Ich habe ein einfaches Beispiel geschrieben, dieses Verhalten zu zeigen:

import java.awt.event.*; 
import javax.swing.*; 

public class SliderTest { 
    public static void main(String args[]) { 
     JFrame frame = new JFrame(); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent we) { 
       System.exit(0); 
      } 
     }); 
     frame.setSize(300, 250); 

     JSlider slider = new JSlider(0, 100, 0); 
     slider.setMajorTickSpacing(10); 
     slider.setMinorTickSpacing(1); 
     slider.setPaintLabels(true); 
     slider.setPaintTicks(true); 

     slider.setMajorTickSpacing(25); 
     slider.setMinorTickSpacing(5); 

     frame.add(slider); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

Zwei einfache Abhilfen scheinen das Problem zu beheben - entweder slider.setLabelTable(null) oder slider.setLabelTable(slider.createStandardLabels(25)) vor dem zweiten Aufruf setMajorTickSpacing verwenden. Angesichts dieser Tatsache scheint es, dass die Etikettentabelle nicht korrekt aktualisiert wird.

Ich bin mir nicht sicher, ob dies das beabsichtigte Verhalten ist oder nicht. Mein erster Instinkt ist, dass das Aktualisieren des Tick-Abstands auch die Labels aktualisieren sollte, aber es gibt auch Argumente, die beiden zu trennen.

Also ich würde gerne wissen, was es ist - ist das ein Fehler in JSlider oder das beabsichtigte Verhalten? Wenn es das beabsichtigte Verhalten ist, was wären die herausragenden Gründe für diese Wahl?

+0

sieht aus wie ein Fehler für mich - guter Fang :-) – kleopatra

+2

Vielen Dank für das Teilen über diesen Kurzschluß. –

Antwort

5

Sie können leicht die Ursache dieses Problems sehen, indem Sie in setMajorTickSpacing Quellcode:

public void setMajorTickSpacing(int n) { 
    int oldValue = majorTickSpacing; 
    majorTickSpacing = n; 
    if (labelTable == null && getMajorTickSpacing() > 0 && getPaintLabels()) { 
     setLabelTable(createStandardLabels(getMajorTickSpacing())); 
    } 
    firePropertyChange("majorTickSpacing", oldValue, majorTickSpacing); 
    if (majorTickSpacing != oldValue && getPaintTicks()) { 
     repaint(); 
    } 
} 

Wenn Sie diese Methode aufrufen, zweimal - labelTable Wert nicht mehr null sein wird, und es wird nicht mehr aktualisiert werden. Es könnte ein beabsichtigtes Verhalten sein nach Methode Kommentar:

* This method will also set up a label table for you. 
* If there is not already a label table, and the major tick spacing is 
* {@code > 0}, and {@code getPaintLabels} returns 
* {@code true}, a standard label table will be generated (by calling 
* {@code createStandardLabels}) with labels at the major tick marks. 

So müssen Sie Etiketten manuell aktualisieren, jedes Mal, wenn sie aktualisiert werden soll (es sei denn, Sie diese Methode mit Ihren eigenen überschreiben, dass das Update tut).

+0

Danke, ich kam zu dem gleichen Schluss, als ich auf die Quelle schaute. Ich würde immer noch argumentieren, dass die Dokumentation besser sein könnte. – charlemagne