
package interfazgrafica11;

import java.awt.EventQueue;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
import javax.swing.SpinnerListModel;
import javax.swing.SpinnerNumberModel;

public class InterfazGrafica11 extends JFrame {
 
    public InterfazGrafica11(){
        Componentes componentes = new Componentes();
        setSize(700,500);
        setTitle("Ejemplo utilización JSpinner");
        ubicarComponentes(componentes);
        inicializar(componentes);
        setVisible(true);
    }
 
    private void ubicarComponentes(Componentes componentes) {

        setLayout(null);
        
        GestorEventos gestorEventos = new GestorEventos(componentes);
        
        addWindowListener(gestorEventos);        // REGISTRO DE ESCUCHA DE EVENTOS DE VENTANA
                   // CONFIGURACIÓN JSpinner jSpinnerNumeros       
        SpinnerNumberModel spinnerNumberModel = new SpinnerNumberModel(3, 0, 30, 5);
        spinnerNumberModel.addChangeListener(gestorEventos);
        componentes.setjSpinnerNumeros(new JSpinner(spinnerNumberModel));
        componentes.getjSpinnerNumeros().setBounds(150, 100, 50, 30);
        add(componentes.getjSpinnerNumeros());
                   // CONFIGURACIÓN JSpinner jSpinnerGeneros   
        String[] generos = {"0 - Generalidades", "1 - Filosofia. Psicologia", "2 - Religion. Teologia", "3 - Ciencias sociales", "4 - No clasificado", "5 - Matematicas. Ciencias naturales", "6 - Ciencias aplicadas", "7 - Bellas artes. Deportes", "8 - Literatura", "9 - Geografia. Historia"};
        SpinnerListModel spinnerListModel = new SpinnerListModel(generos);
        spinnerListModel.addChangeListener(gestorEventos);
        componentes.setjSpinnerGeneros(new JSpinner(spinnerListModel));
        componentes.getjSpinnerGeneros().setBounds(150, 200, 250, 30);
        add(componentes.getjSpinnerGeneros());  
                    // CONFIGURACIÓN JSpinner jSpinnerFechas                             
        Date fechaActual = new Date();   
        /*
        // La siguiente configuración del SpinnerDateModel permite establecer límites inferior y superior al rango de fechas accesibles desde el Spinner.
        // Con estos parámetros, para que no se produzca error, es necesario supervisar en el establecimieno de dichas fechas límites que se encuentran dentro del mismo mes que fecha actual.
        // Dicha supervisión aparece implementada a efectos de no incrementar la extensión del código.
        Date fechaInicial = new Date();
        int diasPreviosMaximo = 2;
        fechaInicial.setTime(fechaActual.getTime() - (long)(24*60*60*1000*diasPreviosMaximo));          
        Date fechaFinal = new Date();
        int diasPosterioresMaximo = 2;
        fechaFinal.setTime(fechaActual.getTime() + (long)(24*60*60*1000*diasPosterioresMaximo));  
        SpinnerDateModel spinnerDateModel = new SpinnerDateModel(fechaActual, fechaInicial, fechaFinal, Calendar.YEAR);
        */
        SpinnerDateModel spinnerDateModel = new SpinnerDateModel(fechaActual, null, null, Calendar.YEAR);
        spinnerDateModel.addChangeListener(gestorEventos);
        componentes.setjSpinnerFechas(new JSpinner(spinnerDateModel));
        componentes.getjSpinnerFechas().setBounds(150, 300, 100, 30);
        componentes.getjSpinnerFechas().setEditor(new JSpinner.DateEditor(componentes.getjSpinnerFechas(), "dd-MM-yyyy"));                
        add(componentes.getjSpinnerFechas());             
        
        componentes.setjLabelNumeros(new JLabel());
        componentes.getjLabelNumeros().setBounds(150, 150, 300, 30);
        add(componentes.getjLabelNumeros());
        
        componentes.setjLabelGeneros(new JLabel());
        componentes.getjLabelGeneros().setBounds(150, 250, 500, 30);
        add(componentes.getjLabelGeneros());
        
        componentes.setjLabelFechas(new JLabel());
        componentes.getjLabelFechas().setBounds(150, 350, 300, 30);
        add(componentes.getjLabelFechas());        
    }
    
    
    private void inicializar(Componentes componentes) {
        componentes.getjLabelNumeros().setText("Dato seleccionado en el JSpinner : " + ((Integer)componentes.getjSpinnerNumeros().getValue()).toString());  // Es innecesario el cast a Integer pero permite dejar constancia de que este JSpinner devuelve un objeto de esta clase
        componentes.getjLabelGeneros().setText("Dato seleccionado en el JSpinner : " + (String)componentes.getjSpinnerGeneros().getValue());  
        componentes.getjLabelFechas().setText("Dato seleccionado en el JSpinner : " + new SimpleDateFormat("dd-MM-yyyy").format((java.util.Date)componentes.getjSpinnerFechas().getValue()));                        
    }
    
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
              @Override
              public void run() {
                 new InterfazGrafica11();
              }
           });  
    }
}
