7.8 JSPINNER

 

Hola a todos, ¿qué tal? El JSpinner es un campo de texto con botones o mejor dicho es una caja de texto con dos flechitas en el lado derecho, una hacia arriba y la otra hacia abajo.



Este control tiene la clase JSpinner que dispone de dos constructores JSpinner() y JSpinner(SpinnerModel modelo).

El primer constructor es el constructor por defecto y el segundo constructor nos permite mostrar los valores en el JSpinner ya sea valores de fecha o una lista de texto, por ejemplo, los meses del año.

Para verlo todo más claro como siempre lo vamos a hacer mediante una práctica cuyo código inicial es el siguiente:

package swing;

 

import javax.swing.*;

 

public class Spinner {

 

       public static void main(String[] args) {

           

             MarcoSpinner mimarco = new MarcoSpinner();

           

             mimarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

       }

 

}

 class MarcoSpinner extends JFrame {

     

       public MarcoSpinner(){

           

             setVisible(true);

           

             setBounds(550, 300, 550, 400);

           

             LaminaSpinner milamina = new LaminaSpinner();

           

             add(milamina);

 

           

       }

}

 class LaminaSpinner extends JPanel {

       

        public LaminaSpinner() {

             

           

        }

       

     

 } 

Dentro del constructor de la lámina vamos a crearnos la instancia del JSpinner al que vamos a llamar control y añadirlo a la instancia:

class LaminaSpinner extends JPanel {

       

        public LaminaSpinner() {

             

            JSpinner control= new JSpinner();

           

            add(control);

 

           

        }

         

 }

Probamos:



Este sería el JSpinner por defecto, empieza por 0 y va incrementando o disminuyendo dependiendo de los botones que pulsemos.

El segundo constructor podemos indicarle en lugar de valores que se muestren fechas o una lista.

Vamos a ver primero como representar fechas, para ello utilizamos un método SpinnerDateModel y sería de la siguiente forma:

        public LaminaSpinner() {

             

            JSpinner control= new JSpinner(new SpinnerDateModel());

           

            add(control);

 

           

        }

Probamos:



Para representar valores de texto utilizamos el método SpinnerListModel, para ello tenemos que crear un array con los valores de texto antes de crear el constructor:

public LaminaSpinner() {

             

            String meses[]= {"Enero", "Febrero", "Marzo", "Abril"};

           

            JSpinner control= new JSpinner(new SpinnerListModel(meses));

           

            add(control);

 

           

        }

Si probamos la aplicación fijaros que el mes de febrero no se ve completo:



Ya que el JSpinner tiene un tamaño por defecto que si lo queremos cambiar se lo podemos especificar. JSpinner hereda de la clase JComponents un método setPreferedSize que pide por argumento un objeto de tipo dimensión. Para cambiar el tamaño del JSpinner creamos primero el objeto de tipo dimensión y después pasamos este objeto al método antes de añadir el JSpinner a la lámina:

public LaminaSpinner() {

             

            String meses[]= {"Enero", "Febrero", "Marzo", "Abril"};

           

            JSpinner control= new JSpinner(new SpinnerListModel(meses));

           

            Dimension d = new Dimension(100,20);

           

            control.setPreferredSize(d);

 

            add(control);

 

           

        }

A la dimensión le pasamos el argumento ancho y largo y si probamos ahora:

 


Dejamos el Spinner por defecto, vamos a ver como acotar el valor de cuando empieza y cuando acaba para ello utilizamos otro constructor SpinnerNumberModel:

SpinnerNumberModel(int value, int minium, int máximum, int stepSize)

Os recomiendo que vayáis a la API deJava para ver más información acerca de los diferentes constructores y el uso de cada uno de ellos para verlo más claro.

Este constructor el que vamos a utilizar ahora le pasamos por parámetro el primer argumento es el número inicial por defecto, el segundo parámetro es el número mínimo que tiene el JSpinner, el tercer parámetro es el valor máximo y el cuarto parámetro es de cuanto en cuanto va aumento o disminuyendo:

        public LaminaSpinner() {

             

            JSpinner control= new JSpinner(new SpinnerNumberModel(5, 0, 30, 3));

           

            Dimension d = new Dimension(100,20);

           

            control.setPreferredSize(d);

           

            add(control);

           

        }

Probamos:



Si aumentamos



Del 5 pasa al valor 8 porque le hemos indicado que aumente de 3 en 3, si le hubiéramos dado al botón contrario nos hubiera disminuido al 2.

No sé si os habrá pasado pero al pulsar el botón inferior os ha disminuido el valor cuando a lo mejor esperabais que aumentara. Por defecto, el comportamiento de estos botones son así, el de abajo disminuye y el de arriba aumenta, aunque podemos cambiar el comportamiento de estos botones para que el de abajo aumente y el de arriba disminuya el valor del JSpinner. Para ello tenemos que crear nuestro propio modelo, es decir, construir nuestro propio modelo y utilizarlo en el constructor, por lo que vamos a empezar creando una clase interna que herede de SpinnerNumberModel:

        private class MiModelo extends SpinnerNumberModel{

           

           

        }

Lo que tenemos que determinar es el valor inicial y en cuanto en cuanto va a aumentar o disminuir y esto se lo indicamos mediante la creación del constructor. Dentro del constructor vamos a llamar al constructor de la clase LaminaSpinner:

        private class MiModelo extends SpinnerNumberModel{

           

            public MiModelo() {

                super(5, 0, 30, 3);

         }

 

        }

Ahora tenemos que saber que métodos hacen que estos botones incrementen o disminuyan el valor del JSpinner para que hagan lo contrario. Si vais a la API de Java estos métodos son getNextValue() y getPreviousValue(), tenemos que sobreescribirlos para que hagan el efecto contrario:

private class MiModelo extends SpinnerNumberModel{

           

            public MiModelo() {

                super(5, 0, 30, 3);

         }

            public Object getNextValue() {

               

                return super.getPreviousValue();

         }

        

         public Object getPreviousValue() {

               

                return super.getNextValue();

         }

 

 

        }

         

 }

Falta instanciar la clase interna dentro del constructor de la clase LaminaSpinner:

public LaminaSpinner() {

             

            JSpinner control= new JSpinner(new MiModelo());

           

            Dimension d = new Dimension(100,20);

           

            control.setPreferredSize(d);

           

            add(control);

           

        }

Y con esto ya estaría, hemos conseguido que el comportamiento de los botones sea diferente, el botón inferior aumenta los valores y el botón superior disminuye los valores del JSpinner.

7.7 JSLIDER << >> 7.9 CREACIÓN DEMENÚS




No hay comentarios:

Publicar un comentario