2012-09-24 23 views
8

He estado teniendo problemas al usar la clase JSlider, específicamente con etiquetas de tic.¿Es esto un error en JSlider?

La primera vez que uso setMajorTickSpacing y setMinorTickSpacing todo funciona como se esperaba. Sin embargo, las llamadas subsiguientes al setMajorTickSpacing actualizan las marcas, pero no las etiquetas. He escrito un ejemplo sencillo para demostrar este comportamiento:

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); 
    } 
} 

Dos simples soluciones temporales parecen solucionar el problema - ya sea usando slider.setLabelTable(null) o slider.setLabelTable(slider.createStandardLabels(25)) antes de la segunda llamada a setMajorTickSpacing. Dado esto, parecería que la tabla de etiquetas no se está actualizando correctamente.

No estoy seguro de si este es el comportamiento previsto o no. Mi primer instinto es que la actualización del espaciado de las marcas también debería actualizar las etiquetas, pero también hay argumentos para separar las dos.

Así que me gustaría saber cuál es - ¿Es esto un error en JSlider o el comportamiento previsto? Si es el comportamiento previsto, ¿cuáles serían las razones más destacadas para tomar esa decisión?

+0

parece un error para mí - buena captura :-) – kleopatra

+2

Gracias por compartir este corto. –

Respuesta

5

Se puede ver fácilmente la causa de este problema buscando en el código fuente setMajorTickSpacing:

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(); 
    } 
} 

Si se llama a este método en dos ocasiones - labelTable valor no nulo más y no será actualizado. Puede ser que sea un comportamiento previsto de acuerdo con el comentario de método:

* 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. 

Así que hay que actualizar las etiquetas de forma manual cada vez que se desea que se actualizan (a menos que anule este método con su propia que hace la actualización)

+0

Gracias, llegué a la misma conclusión cuando miré la fuente. Aún diría que la documentación podría ser mejor. – charlemagne

Cuestiones relacionadas