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