Saltar al contenido

JFrame y JPanel en java. Ejercicio de Interfaces (II).

Para este ejemplo, seguiremos utilizando JFrame y JPanel además del modelo vista controlador (M.V.C.) para crear una interfaz gráfica.

Dentro de una ventana, colocaremos nueve botones, los cuales se desactivarán al hacer clic.

Para comenzar crearemos como siempre 4 paquetes.

  • Modelo. En este paquete se crearán los objetos de datos si los hubiere. Como en este caso no vamos a trabajar con bases de datos, no sería necesario implementarlo.
  • Vista. En este paquete, crearemos las vistas de la aplicacion, es decir los JFrame y jPanel.
  • Controlador. Lo utilizaremos para conectar el paquete modelo y el paquete vista.
  • Arranque. Aquí implementaremos el método main para poder arrancar el programa.
Índice de contenidos

    Creando el jFrame y jPanel.

    Dentro del paquete vista crearemos una ventana que contendrá una lámina o JPanel llamada laminaFondo. Esta tendrá una distribución de tipo BorderLayout y en su interior, tendrá los siguientes controles:

    • Un JLabel a modo de título en la parte superior (parte NORTH).
    • Otro JLabel en la parte de abajo que indicará el número que botón que se ha pulsado.
    • En la parte central de este panel, se colocará otra lámina o JPanel con una distribución tipo GridLayout (distribución tipo rejilla), que contendrá los botones del 1 al 9.
    package vista;
    
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    
    // Importamos el paquete swing para trabajar con interfaces gráficas
    import javax.swing.*;
    
    /**
     * ESTA CLASE DEBE HEREDAR DE JFRAME PARA PODER
     * CREAR LA VENTANA DE NUESTRA INTERFAZ
     */	
    public class VentanaDesactivarBotones extends JFrame{
    	
        /* Esta variable no es necesaria, pero si
         * muy recomendable, ya que nos evitará problemas
         * si hay futuras actualizaciones de la aplicacion*/
    	private static final long serialVersionUID = 1L;
       
    	// Creamos una lámina para colocar encima del JFrame
    	public JPanel laminaFondo = new JPanel(); 
        public JPanel laminaBotones = new JPanel();
    	
    	// Creamos los controles que tendrá nuestra lámina
    	 private JLabel lblTitulo = new JLabel();
    	 public JLabel lblNumero = new JLabel(); 
    	 public JButton [] botones =new JButton[9];
    	
        /**
         * EL CONSTRUCTOR CREA LA VENTANA, LE DA UNAS PROPIEDADES
         * Y ADEMÁS EN EL, SE INDICA QUE SE LE AGREGUE UN JPANEL
         * O LO QUE ES LO MISMO, UNA LAMINA PARA PODER AGREGAR
         * LOS CONTROLES NECESARIOS
         */
    	public VentanaDesactivarBotones() {
             
            // Le damos un tamaño a la ventana
            this.setSize(640, 480);
            
            // Agregamos un tículo
            this.setTitle("Desactivar botones");
             
            // Lo centramos en pantalla
            this.setLocationRelativeTo(null);
             
            /* Le decimos que no se puede redimensionar*/
            this.setResizable(false);
             
            // Le decimos que al cerrar la ventana, acabe el programa
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             
            // Agregamos una lámina a la ventana
            this.getContentPane().add(laminaFondo);
            
            // llamamos al método que configura la lamina fondo
            // y la lamina de los botones
            configurarLaminaFondo();
            configurarLaminaBotones();   
        }
    	
    	/**
    	 * ESTE MÉTODO CONFIGURA NUESTRA LÁMINA (JPANEL) Y AGREGA LOS CONTROLES
    	 * AL JPANEL DE NUESTRA VENTANA
    	 */
    	private void configurarLaminaFondo() {
    		
    		// Le damos a la lamina una distribución de tipo BorderLayout.
    		laminaFondo.setLayout(new BorderLayout());
    		
    		// Colocamos un texto a las etiquetas
    		lblTitulo.setText("Pulsa cada botón para desactivarlo");
    		lblNumero.setText("Número");
    		
    		// Agregamos las etiquetas al norte y al sur de la lamina
    		laminaFondo.add(lblNumero,BorderLayout.SOUTH);
    		laminaFondo.add(lblTitulo,BorderLayout.NORTH);
    		
    	    // Alineamos el texto de las etiquetas
    		lblNumero.setHorizontalAlignment(SwingConstants.CENTER);
    		lblTitulo.setHorizontalAlignment(SwingConstants.CENTER);
    		  
    	}
    	
    	private void configurarLaminaBotones() {
    		
    		// Le damos a la lamina botones una distribucion del tipo GridLayout
    		laminaBotones.setLayout(new GridLayout(3,3));
    		
    		/* Con un bucle, agrego los botones del 1 al 9
    	     * al panel en forma de rejilla*/
    	    for(int x=0;x<botones.length;x++) {
    	                 
    	        botones[x]=new JButton("Botón " + (x+1));
    	        laminaBotones.add(botones[x]);
    	    }     
    	 
    	    // Agregamos la laminaBotones en el
    	    // centro de la laminaFondo
    	    laminaFondo.add(laminaBotones,BorderLayout.CENTER);
    	}
    }
    

    En este ejemplo también se pude ver como se crean un jFrame y un jPanel.

    Implementando el controlador de acciones de nuestra interfaz.

    Una vez hemos construido nuestra interfaz ahora con el jFrame, el JPanel y los controles, vamos a crear dentro del paquete controlador las instrucciones necesarias para poner a la escucha los botones.

    package controlador;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import vista.*;
    
    /**
     * ESTA CLASE DEBE IMPLEMENTAR LA INTERFAZ DE JAVA ACTIONLISTENER
     * Y DEBE SOBREESCRIBIR TODOS LOS MÉTODOS QUE CONTENGA ESTA INTERFAZ
     */
    
    public class ControlClics implements ActionListener {
    
    	// Creamos una variable de tipo PintarVentana
    	VentanaDesactivarBotones vistaDesactivarVentana;
    	
    	/**
    	 * EL MÉTODO CONSTRUCTOR RECIBIRÁ POR PARÁMETRO UN
    	 * OBJETO DE TIPO PINTAR VENTANA Y A ESTE OBJETO
    	 */
    	
    	public ControlClics(VentanaDesactivarBotones vDesactivar) {
    		// A La variable vistaDesactivarBotones se le asignara
    		// un objeto de la clase DesactivarBotones llamado vDesactivar
    		// y el cual se le esta pasando por parámetro
    		// en el constructor de esta clase
    		this.vistaDesactivarVentana=vDesactivar;
    	}
    	
    	/**
    	 * ESTE MÉTODO PONE A LA ESCUCHA DE LOS EVENTOS
    	 * DE CLIC DE RATON A CADA UNO DE LOS BOTONES
    	 * DE LA VENTANA CREADA EN EL PAQUETE VISTA
    	 */
    	public void escucharEventos() {
    		
    		for(int x=0;x<vistaDesactivarVentana.botones.length;x++) {
    			vistaDesactivarVentana.botones[x].addActionListener(this);
    		}
    	}
    	
    	/**
    	 * ESTE MÉTODO SE ENCARGA DE EJECUTAR LAS ACCIONES
    	 * 
    	 */
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		
    		 
            if(e.getSource().equals(vistaDesactivarVentana.botones[0])) {
            	vistaDesactivarVentana.botones[0].setEnabled(false);
            	vistaDesactivarVentana.lblNumero.setText("Botón 1 desactivado");
            }
             
            else if(e.getSource().equals(vistaDesactivarVentana.botones[1])) {
            	vistaDesactivarVentana.botones[1].setEnabled(false);
            	vistaDesactivarVentana.lblNumero.setText("Botón 2 desactivado");
            }
             
            else if(e.getSource().equals(vistaDesactivarVentana.botones[2])) {
            	vistaDesactivarVentana.botones[2].setEnabled(false);
            	vistaDesactivarVentana.lblNumero.setText("Botón 3 desactivado");
            }
            else if(e.getSource().equals(vistaDesactivarVentana.botones[3])) {
            	vistaDesactivarVentana.botones[3].setEnabled(false);
            	vistaDesactivarVentana.lblNumero.setText("Botón 4 desactivado");
            }
             
            else if(e.getSource().equals(vistaDesactivarVentana.botones[4])) {
            	vistaDesactivarVentana.botones[4].setEnabled(false);
            	vistaDesactivarVentana.lblNumero.setText("Botón 5 desactivado");
            }
             
            else if(e.getSource().equals(vistaDesactivarVentana.botones[5])) {
            	vistaDesactivarVentana.botones[5].setEnabled(false);
            	vistaDesactivarVentana.lblNumero.setText("Botón 6 desactivado");
            }
            
            else if(e.getSource().equals(vistaDesactivarVentana.botones[6])) {
            	vistaDesactivarVentana.botones[6].setEnabled(false);
            	vistaDesactivarVentana.lblNumero.setText("Botón 7 desactivado");
            }
            
            else if(e.getSource().equals(vistaDesactivarVentana.botones[7])) {
            	vistaDesactivarVentana.botones[7].setEnabled(false);
            	vistaDesactivarVentana.lblNumero.setText("Botón 8 desactivado");
            }
            else if(e.getSource().equals(vistaDesactivarVentana.botones[8])) {
            	vistaDesactivarVentana.botones[8].setEnabled(false);
            	vistaDesactivarVentana.lblNumero.setText("Botón 9 desactivado");
            }
    	}
    }
    

    Conectando el paquete controlador y el jFrame.

    Para conectar tanto la interfaz gráfica con el controlador, debemos instanciar un objeto de la clase ControlClics en nuestra clase Desactivar Botones del paquete vista, esto lo haremos de la siguiente manera:

    // Creamos una instancia de nuestra clase controlador
    private ControlClics ejecutarAcciones;
    
    /**
    * ESTE MÉTODO EJECUTA LAS ACCIONES DEL CONTROLADOR UNA VEZ
    * QUE ES LLAMADO DESDE EL CONSTRUCTOR DE ESTA CLASE
    */
    private void ejecutar() {
    	ejecutarAcciones = new ControlClics(this);
    	ejecutarAcciones.escucharEventos();
    }
    
    /**
    * EL CONSTRUCTOR QUEDARÍA DE LA SIGUIENTE MANERA:
    */
    public VentanaDesactivarBotones() {
             
            // Le damos un tamaño a la ventana
            this.setSize(640, 480);
            
            // Agregamos un tículo
            this.setTitle("Desactivar botones");
             
            // Lo centramos en pantalla
            this.setLocationRelativeTo(null);
             
            /* Le decimos que no se puede redimensionar*/
            this.setResizable(false);
             
            // Le decimos que al cerrar la ventana, acabe el programa
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             
            // Agregamos una lámina a la ventana
            this.getContentPane().add(laminaFondo);
            
            // llamamos al método que configura la lamina fondo
            // y la lamina de los botones
            configurarLaminaFondo();
            configurarLaminaBotones();
            ejecutar();
        }	 
    

    Como arrancar el programa.

    Para arrancar nuestro programa solo debemos implementar el método main de nuestra aplicación. Este método se encuentra en una clase llamada principal dentro del paquete arranque.

    package arranque;
    
    // Importamos el paquete vista
    import vista.*;
    
    public class Principal {
    
    	public static void main(String[] args) {
    		
    		// Creamos una instancia de la clase PintarVentana
    		VentanaDesactivarBotones ventanaPintada=new VentanaDesactivarBotones();
    		
    		// Hacemos visible la ventana
    		ventanaPintada.setVisible(true);
    	}
    }
    

    DESCARGAR PROYECTO