## Cómo usar Sliders

Se utiliza un JSlider para permitir que el usuario introduzca un valor numérico limitado por una valor máximo y un valor mínimo. Mediante la utilización de un Slider en vez de text field, se eliminan errores de entrada.

Aquí tenemos una imagen de una aplicación que utiliza un Slider para controlar la velocidad de una animación:

> Intenta esto:
> 1. Compila y ejecuta la aplicación. El fichero fuente es SliderDemo.java. También necesitarás las 16 imágenes del directorio example-swing/images que empiezan con "burger".
> 2. Utiliza el Slider para ajustar la velocidad de animación.

Aquí está el código de SliderDemo.java que crea el Slider el programa anterior.

    JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL, 0, 30, FPS_INIT);
    framesPerSecond.addChangeListener(new SliderListener());
    framesPerSecond.setMajorTickSpacing(10);
    framesPerSecond.setMinorTickSpacing(1);
    framesPerSecond.setPaintTicks(true);
    framesPerSecond.setPaintLabels(true);
    framesPerSecond.setBorder(BorderFactory.createEmptyBorder(0,0,10,0));
    . . .
    //add the slider to the content pane
    contentPane.add(framesPerSecond);

Por defecto, el espacio para las marcas mayores y menores es cero. Para ver estas marcas, debemos especificar el espaciado de los ticks mayor o menor (o ambos) a un valor distinto de cero y llamar a setPaintTicks(true) (llamar sólo a setPaintTicks(true) no es suficiente). Para salidas estándard, las etiquetas numéricas en la posición marcas mayores seleccionan el mayor espaciado entre marcas, luego se llama setPaintLabels(true). El programa de ejemplo proporciona la etiqueta para sus deslizadores de esta forma. Sin embargo, las etiquetas del Slider son altamente configurables. Puedes ver un ejemplo en Proporcionar Etiquetas para Deslizadores.

Cuando se mueve el deslizador, se llama al método stateChanged del ChangeListener del deslizador, cambiando la velocidad de la animación:

    class SliderListener implements ChangeListener {
        public void stateChanged(ChangeEvent e) {
            JSlider source = (JSlider)e.getSource();
            if (!source.getValueIsAdjusting()) {
    	    int fps = (int)((JSlider)e.getSource()).getValue();
    	    if (fps == 0) {
    	        if (!frozen) stopAnimation();
    	    } else {
    	        delay = 1000 / fps;
    	        timer.setDelay(delay);
    	        if (frozen) startAnimation();
    	    }
            }
        }
    }

Si movemos el deslizador hasta cero, la animación se para.

Observa que el método stateChanged sólo cambia la velocidad de la animación si getValueIsAdjusting devuelve false. Muchos eventos change se disparan cuando el usuario mueve el deslizador. Este programa sólo está interesado en el resultado final de la acción del usuario.

#### Porporcionar Etiquetas para Deslizadores

> Para mostrar etiquetas en un deslizador, debemos llamar a setPaintLabels(true) y proporcionar un conjunto de etiquetas que indiquen las posiciones y valores para cada etiqueta. Las etiquetas pueden especificarse utilizando una de las siguientes técnicas:
> 1. Llamar a setMajorTickSpacing con un valor distinto de cero. Haciéndolo de esta manera, las etiquetas idendifican el valor de cada marca de pulsación mayor. Esta es la técnica utiliza por SliderDemo.java.
> 2. Crear un Hashtable que contenga el valor para cada etiqueta y su posición. Se proporciona el Hashtable como un argumento a setLabelTable.

>    SliderDemo2.java, utiliza esta técnica:

>    Aquí está el código de SliderDemo2.java que crea el deslizador:

>        //Create the slider
>        JSlider framesPerSecond = new JSlider(JSlider.VERTICAL, 0, 30, FPS_INIT);
>        framesPerSecond.addChangeListener(new SliderListener());
>        framesPerSecond.setMajorTickSpacing(10);
>        framesPerSecond.setPaintTicks(true);

>        //Create the label table
>        Dictionary labelTable = new Hashtable();
>        labelTable.put( new Integer( 0 ), new JLabel("Stop") );
>        labelTable.put( new Integer( 3 ), new JLabel("Slow") );
>        labelTable.put( new Integer( 30 ), new JLabel("Fast") );
>        framesPerSecond.setLabelTable( labelTable );

>        framesPerSecond.setPaintLabels(true);
>        framesPerSecond.setBorder(BorderFactory.createEmptyBorder(0,0,0,10));

>    Este código crea explícitamente un Hashtable y lo rellena con los valores de las etiquetas y sus posiciones. Cada valor de etiqueta debe ser un Component y en este programa, son simples etiquetas de texto. También podemos utilizar etiquetas con iconos. Si queremos etiquetas numéricas posicionadas a intervalor específicos, podemos utilizar el método createStandardLabels de JSlider.

#### El API Slider

> Las siguiente tablas listan los métodos y constructores más utilizados de JSlider. Otros métodos interesantes son definidos por las clases JComponent y Component.

> Ajsute Fino de la Apariencia del Deslizador
> Método | Propósito
> --- | ---
> void setValue(int) int getValue() | Seleciona u obtiene el valor actual del Slider. El marcador del deslizador está en esta posición.
> void setOrientation(int) int getOrientation() | Seleciona u obtiene la orientación del Slider. Los posibles valores son JSlider.HORIZONTAL o JSlider.VERTICAL
> void setInverted(boolean) boolean getInverted() | Seleciona u obtiene si el máximo se muestra a la izquierda en un deslizador horizontal o abajo en uno vertical, por lo tanto invierte el rango del deslizador.
> void setMinimum(int) int getMinimum() void setMaximum(int) int getMaximum() | Seleciona u obtiene los valores máximos o mínimos del deslizador. Juntos selecionan u obtienen el rango del deslizador.
> void setMajorTickSpacing(int) int getMajorTickSpacing() void setMinorTickSpacing(int) int getMinorTickSpacing() | Seleciona u obtiene el rango entre marcas mayores y menores. Debemos llamar a setPaintTicks(true) para que aparezcan las marcas.
> void setPaintTicks(boolean) boolean getPaintTicks() | Seleciona u obtiene si se dibujan las marcas en el deslizador.
> void setLabelTable(Dictionary) Dictionary getLabelTable() | Seleciona u obtiene las etiquetas para el deslizador. Debemos llamar a setPaintLabels(true) para que aparezcan las etiquetas. createStandardLabels es un método de conveniencia para crear un conjunto de etiquetas estándard.
> void setPaintLabels(boolean) boolean getPaintLabels() | Seleciona u obtiene si se dibujan las etiquetas de un deslizador. Las etiquetas se seleccionan con setLabelTable o configurando el espaciado entre marcas mayores.

#### Ejemplos que utilizan JSlider

> Esta tablas muestra ejemplos que usan JSlider y dónde encontrarlos.

> Ejemplo | Dónde se Describe | Notas
> --- | --- | ---
> SliderDemo.java | Esta página. | Muestra un deslizador con etiquetas en las marcas mayores.
> SliderDemo2.java | Esta página. | Mustra un deslizador vertical con etiquetas personalizadas.

Ozito