Mostrando entradas con la etiqueta GUI. Mostrar todas las entradas
Mostrando entradas con la etiqueta GUI. Mostrar todas las entradas

lunes, 10 de marzo de 2014

Práctica de creación de Jarras (Parte 3) GUI

Buenas, hoy vamos a implementar una GUI para la aplicación de Jarras vista anteriormente. Vamos a intentar que se parezca lo más posible a esto:



La clase que implementa el panel gráfico será la clase PanelJarras, que debe implementar la interfaz  istaJarras, ControladorJarras será la clase controladora y AplicacionJarras la clase principal de la aplicación. El programa Jarras será el de las prácticas anteriores. La interfaz VistaJarras se proporciona a continuación:
import java.awt.event.ActionListener;

public interface VistaJarras { 
 public static final String INICIAR = "INICIAR"; 
 public static final String LLENAR_A = "LLENAR_A"; 
 public static final String LLENAR_B = "LLENAR_B"; 
 public static final String VACIAR_A = "VACIAR_A"; 
 public static final String VACIAR_B = "VACIAR_B"; 
 public static final String VOLCAR_A_EN_B = "VOLCAR_A_EN_B"; 
 public static final String VOLCAR_B_EN_A = "VOLCAR_B_EN_A"; 
 public static final String FINALIZAR = "FINALIZAR"; 
 /** 
  *  * * Pasamos el controlador.
  *   */ 
 public void controlador(ActionListener ctr); 
 /** 
  * * Obtenemos la capacidad inicial de la jarra A.
  * * @return int con la capacidad inicial de la jarra A.
  *  */ 
 public int capacidadInicialA(); 
 /** 
  * * Obtenemos la capacidad inicial de la jarra B
  * * @return int con la capacidad inicial de la jarra B.
  *  */

 public int capacidadInicialB();
 /**
  *
  *
  ** Mostramos un mensaje de error.
  ** @param mensaje
  * * String con el mensaje a mostrar.
  *
  *@return 
  * */
 public void error(String mensaje);

 /**
  * * Mostramos un mensaje de información.
  * * @param mensaje
  * String con el mensaje a mostrar. 
  */ 
 public void ok(String mensaje); 
 /** 
 *  Habilitamos o deshabilitamos el modo inicialización de jarras o trasvases
 *  @param b
 *  true para habilitar el modo inicialización; false para el modo trasvases 
  */ 
 public void habilitarInicio(boolean b); 
 /** 
* Establecemos la capacidad de la jarra A.
* @param c
 * int con la capacidad de la jarra A 
 */ 
public void capacidadA(int c); 
/** 
* Establecemos la capacidad de la jarra B.
* @param c
 * int con la capacidad de la jarra B. 
 */ 
public void capacidadB(int c); 
/** 
* Establecemos el contenido de la jarra A.
* @param c
 * int con el contenido de la jarra A. 
 */ 
public void contenidoA(int c); 
/** 
* Establecemos el contenido de la jarra B.
* @param c
 * int con el contenido de la jarra B. 
 */ 
public void contenidoB(int c); 
/** 
* Añadimos un mensaje al histórico.
* @param mensaje
 * String con el mensaje a añadir. 
 */ 
public void añadirAHistórico(String mensaje); 
/** 
* Limpiamos el histórico.
 */ 
public void limpiar(); 
}

NOTA 1: Cuando a un componente se le asigna un GridLayout es posible especificar en el constructor el margen que debe quedar entre el elemento a insertar y el borde de la cuadrícula. Así, si creamos un objeto con new GridLayout(4,2,5,5) además de crear la matriz de 4x2 para insertar componentes, cada componente se mostrará con un margen de 5 puntos por cada lado. Es decir, la separación entre componentes será de 10 puntos.

NOTA 2: Mientras las jarras no hayan sido correctamente inicializadas, no tiene sentido hacer trasvases sobre ellas. Por eso la aplicación tiene dos modos. Modo de inicialización de jarras en as que sólo es posible actuar sobre el botón de iniciar capacidades, y modo trasvase en las que ya es posible los trasvases pero no la inicialización. El botón finalizar nos lleva de nuevo al modo de inicialización de jarras.

La verdad es que no necesitais programa de test más que el que se usó para la otra práctica de jarras; pues la GUI se testea "toqueteandola". Aquí teneis los resultados:

Aquí el main
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class AplicacionJarras {
 public static void main(String[] args) {
  VistaJarras vj = new PanelJarras();
  //Jarras jarraA;
  //Jarras jarraB;
  
  ActionListener ctrJarras = new ControladorJarras(vj);
  vj.controlador(ctrJarras);
  JFrame ventana = new JFrame("Control de Jarras");
  
  ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  ventana.setContentPane((JPanel)vj);
  ventana.pack();
  ventana.setVisible(true);
 }
}


Aquí el Controlador
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class ControladorJarras implements ActionListener{

 private Jarras jarraA, jarraB;
 private VistaJarras vistaJarra;
 
 public ControladorJarras(VistaJarras vj) {
  vistaJarra = vj;
  vistaJarra.habilitarInicio(true);
  vistaJarra.ok("Indique las capacidades iniciales");
 }
 
 @Override
 public void actionPerformed(ActionEvent e) {
  // TODO Auto-generated method stub
  
  String comando = e.getActionCommand();
  try{
   if(comando.equals(VistaJarras.INICIAR)) {
    
    vistaJarra.habilitarInicio(false);
    jarraA = new Jarras(vistaJarra.capacidadInicialA());
    jarraB = new Jarras(vistaJarra.capacidadInicialB());
    vistaJarra.capacidadA(jarraA.capacidad());
    vistaJarra.capacidadB(jarraB.capacidad());
    vistaJarra.ok("Jarras creadas con éxito");
   } else if(comando.equals(VistaJarras.LLENAR_A)) {
    
    jarraA.llena();
    vistaJarra.contenidoA(jarraA.cantidad());
    vistaJarra.añadirAHistórico("Llenamos la jarra A");
    vistaJarra.ok("Jarra A llena al completo");
   } else if(comando.equals(VistaJarras.LLENAR_B)) {
    
    jarraB.llena();
    vistaJarra.contenidoB(jarraB.cantidad());
    vistaJarra.añadirAHistórico("Llenamos la jarra B");
    vistaJarra.ok("Jarra B llena al completo");
   } else if (comando.equals(VistaJarras.VACIAR_A)){
    jarraA.vacia();
    vistaJarra.contenidoA(jarraA.cantidad());
    vistaJarra.añadirAHistórico("Vaciamos la jarra A");
    vistaJarra.ok("Jarra A vacía");
   } else if(comando.equals(VistaJarras.VACIAR_B)) {
    jarraB.vacia();
    vistaJarra.contenidoB(jarraB.cantidad());
    vistaJarra.añadirAHistórico("Vaciamos la jarra B");
    vistaJarra.ok("Jarra B vacía");
   } else if(comando.equals(VistaJarras.VOLCAR_A_EN_B)) {
    jarraB.llenaDesde(jarraA);
    vistaJarra.contenidoB(jarraB.cantidad());
    vistaJarra.contenidoA(jarraA.cantidad());
    vistaJarra.añadirAHistórico("Volcamos el contenido de la Jarra A en la Jarra B");
    vistaJarra.ok("Jarra A vaciada en Jarra B");
   } else if(comando.equals(VistaJarras.VOLCAR_B_EN_A)) {
    jarraA.llenaDesde(jarraB);
    vistaJarra.contenidoA(jarraA.cantidad());
    vistaJarra.contenidoB(jarraB.cantidad());
    vistaJarra.añadirAHistórico("Volcamos el contenido de la Jarra B en la Jarra A");
    vistaJarra.ok("Jarra B vaciada en Jarra A");
   } else if(comando.equals(VistaJarras.FINALIZAR)) {
    vistaJarra.limpiar();
    vistaJarra.habilitarInicio(true);
    vistaJarra.ok("Indique las capacidades iniciales");
    jarraA = null;
    jarraB = null;
    
   }
  } catch (NumberFormatException e1) {
   vistaJarra.error("No ha introducido un valor numérico");
  } catch (RuntimeException e2) {
   vistaJarra.error("Se ha producido un error");
  }
 }

}


Y aquí el panel
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionListener;

import javax.swing.*;


public class PanelJarras extends JPanel implements VistaJarras{
 private static final long serialVersionUID = 1L;
 private JButton botonIniciar, botonLlenarA, botonLlenarB, botonVaciarA, botonVaciarB, botonVolcarAenB, botonVolcarBenA, botonFinalizar;
 private JLabel etiquetaJarraA, etiquetaJarraB, etiquetaInformacion, etiquetaContenidoA, etiquetaContenidoB, etiquetaCapacidadA, etiquetaCapacidadB;
 private JTextArea textoCapacidadInicialA, textoCapacidadInicialB, textoAreaHistorico, textoCapacidadA, textoCapacidadB, textoContenidoA, 
   textoContenidoB;
 private ImageIcon der, izq;
 
 public PanelJarras() {
  der = new ImageIcon("next.jpg");
  izq = new ImageIcon("previous.jpg");
  
  botonIniciar = new JButton("Iniciar");
  botonLlenarA = new JButton("Llenar");
  botonLlenarB = new JButton("Llenar");
  botonVaciarA = new JButton("Vaciar");
  botonVaciarB = new JButton("Vaciar");
  botonVolcarAenB = new JButton(der);
  botonVolcarBenA = new JButton(izq);
  botonFinalizar = new JButton("Finalizar");
  
  etiquetaJarraA = new JLabel("Jarra A: ");
  etiquetaJarraB = new JLabel("Jarra B: ");
  etiquetaInformacion = new JLabel(" ");
  etiquetaContenidoA = new JLabel("Contenido");
  etiquetaCapacidadA = new JLabel("Capacidad");
  etiquetaContenidoB = new JLabel("Contenido");
  etiquetaCapacidadB = new JLabel("Capacidad");
  
  textoCapacidadInicialA = new JTextArea();
  textoCapacidadInicialB = new JTextArea();
  textoCapacidadA = new JTextArea();
  textoCapacidadB = new JTextArea();
  textoContenidoA = new JTextArea();
  textoContenidoB = new JTextArea();
  textoAreaHistorico = new JTextArea();
  textoContenidoA.append("0");
  textoContenidoB.append("0");
  textoContenidoA.setEditable(false);
 // textoContenidoB.setEditable(false);
  textoCapacidadA.setEditable(false);
  textoCapacidadB.setEditable(false);
  
  //Paneles previos a los de inicio
  JPanel panelInicA = new JPanel();
  panelInicA.setLayout(new GridLayout(1, 2));
  panelInicA.add(etiquetaJarraA);
  panelInicA.add(textoCapacidadInicialA);
  
  JPanel panelInicB = new JPanel();
  panelInicB.setLayout(new GridLayout(1, 2));
  panelInicB.add(etiquetaJarraB);
  panelInicB.add(textoCapacidadInicialB);
  
  
  //Panel de inicio
  JPanel panelInic = new JPanel();
  panelInic.setLayout(new GridLayout(1, 3));
  panelInic.add(panelInicA);
  panelInic.add(botonIniciar);
  panelInic.add(panelInicB);
  
  
  //Paneles previos a los de las Jarra
  JPanel panelContPrevA = new JPanel();
  panelContPrevA.setLayout(new GridLayout(1, 2));
  panelContPrevA.add(etiquetaContenidoA);
  panelContPrevA.add(textoContenidoA);
    
  JPanel panelContPrevB = new JPanel();
  panelContPrevB.setLayout(new GridLayout(1, 2));
  panelContPrevB.add(etiquetaContenidoB);
  panelContPrevB.add(textoContenidoB);
  
  JPanel panelCapPrevA = new JPanel();
  panelCapPrevA.setLayout(new GridLayout(1, 2));
  panelCapPrevA.add(etiquetaCapacidadA);
  panelCapPrevA.add(textoCapacidadA);
    
  JPanel panelCapPrevB = new JPanel();
  panelCapPrevB.setLayout(new GridLayout(1, 2));
  panelCapPrevB.add(etiquetaCapacidadB);
  panelCapPrevB.add(textoCapacidadB);
    
    
  //Panel de la Jarra A
  JPanel panelJarraA = new JPanel();
  panelJarraA.setLayout(new GridLayout(4, 1, 5, 5));
  panelJarraA.add(botonLlenarA);
  panelJarraA.add(panelContPrevA);
  panelJarraA.add(panelCapPrevA);
  panelJarraA.add(botonVaciarA);
  
  //Panel de la Jarra B
  JPanel panelJarraB = new JPanel();
  panelJarraB.setLayout(new GridLayout(4, 1, 5, 5));
  panelJarraB.add(botonLlenarB);
  panelJarraB.add(panelContPrevB);
  panelJarraB.add(panelCapPrevB);
  panelJarraB.add(botonVaciarB);
  
  //Panel central
  JPanel panelCentro = new JPanel();
  panelCentro.setLayout(new GridLayout(3, 1));
  panelCentro.add(botonVolcarAenB);
  panelCentro.add(botonVolcarBenA);
  panelCentro.add(botonFinalizar);
  
  //Panel de comandos
  JPanel panelComand = new JPanel();
  panelComand.setLayout(new GridLayout(1, 3));
  panelComand.add(panelJarraA);
  panelComand.add(panelCentro);
  panelComand.add(panelJarraB);
  
  //mitad de arriba
  JPanel panelArriba = new JPanel();
  panelArriba.setLayout(new GridLayout(2, 1));
  panelArriba.add(panelInic);
  panelArriba.add(panelComand);
  
  //mitad de Abajo
  JPanel panelAbajo = new JPanel();
  panelAbajo.setLayout(new GridLayout(2, 1));
  panelAbajo.add(textoAreaHistorico);
  panelAbajo.add(etiquetaInformacion);
  
  setLayout(new GridLayout(2, 1));
  add(panelArriba, BorderLayout.NORTH);
  add(panelAbajo, BorderLayout.SOUTH);
  
 }
 
 @Override
 public void controlador(ActionListener ctr) {
  // TODO Auto-generated method stub
  botonIniciar.addActionListener(ctr);
  botonLlenarA.addActionListener(ctr);
  botonLlenarB.addActionListener(ctr);
  botonVaciarA.addActionListener(ctr);
  botonVaciarB.addActionListener(ctr);
  botonVolcarAenB.addActionListener(ctr);
  botonVolcarBenA.addActionListener(ctr);
  botonFinalizar.addActionListener(ctr);
  
  botonIniciar.setActionCommand(VistaJarras.INICIAR);
  botonLlenarA.setActionCommand(VistaJarras.LLENAR_A);
  botonLlenarB.setActionCommand(VistaJarras.LLENAR_B);
  botonVaciarA.setActionCommand(VistaJarras.VACIAR_A);
  botonVaciarB.setActionCommand(VistaJarras.VACIAR_B);
  botonVolcarAenB.setActionCommand(VistaJarras.VOLCAR_A_EN_B);
  botonVolcarBenA.setActionCommand(VistaJarras.VOLCAR_B_EN_A);
  botonFinalizar.setActionCommand(VistaJarras.FINALIZAR);
  
 
  // ....................................................................................................
  
 }

 @Override
 public int capacidadInicialA() {
  return Integer.parseInt(textoCapacidadInicialA.getText());
 }

 @Override
 public int capacidadInicialB() {
  return Integer.parseInt(textoCapacidadInicialB.getText());
 }

 @Override
 public void error(String mensaje) {
  // TODO Auto-generated method stub
  etiquetaInformacion.setForeground(Color.RED);
  etiquetaInformacion.setText(mensaje);
  
 }

 @Override
 public void ok(String mensaje) {
  // TODO Auto-generated method stub
  etiquetaInformacion.setForeground(Color.BLUE);
  etiquetaInformacion.setText(mensaje);
  
 }

 @Override
 public void habilitarInicio(boolean b) {
  // TODO Auto-generated method stub
  etiquetaJarraA.setEnabled(b);
  etiquetaJarraB.setEnabled(b);
  botonIniciar.setEnabled(b);
  textoCapacidadInicialA.setEditable(b);
  textoCapacidadInicialB.setEditable(b);
  
  botonLlenarA.setEnabled(!b);
  botonLlenarB.setEnabled(!b);
  botonVaciarA.setEnabled(!b);
  botonVaciarB.setEnabled(!b);
  botonFinalizar.setEnabled(!b);
  botonVolcarAenB.setEnabled(!b);
  botonVolcarBenA.setEnabled(!b);
  etiquetaContenidoA.setEnabled(!b);
  etiquetaContenidoB.setEnabled(!b);
  etiquetaCapacidadA.setEnabled(!b);
  etiquetaCapacidadB.setEnabled(!b);
   
  
 }

 @Override
 public void capacidadA(int c) {
  // TODO Auto-generated method stub

  textoCapacidadA.setText(" " +c);
 }

 @Override
 public void capacidadB(int c) {
  // TODO Auto-generated method stub

  textoCapacidadB.setText(" " +c);
 }

 @Override
 public void contenidoA(int c) {
  // TODO Auto-generated method stub
  textoContenidoA.setText(" " +c);
  
 }

 @Override
 public void contenidoB(int c) {
  // TODO Auto-generated method stub
  textoContenidoB.setText(" " +c);
  
 }

 @Override
 public void añadirAHistórico(String mensaje) {
  // TODO Auto-generated method stub
  textoAreaHistorico.append(mensaje + "\n");
  
 }

 @Override
 public void limpiar() {
  // TODO Auto-generated method stub
  textoAreaHistorico.setText(" ");
  textoCapacidadA.setText(" ");
  textoCapacidadB.setText(" ");
  textoContenidoA.setText(" ");
  textoContenidoB.setText(" ");
  
 }

}


Espero que os esté pareciendo, cuanto menos, interesante este blog. A ver si puedo subir continuamente esta semanilla, pues me voy a un congreso en Gijón y voy a estar liadillo :p

Saludos y a seguir aprendiendo ;)

viernes, 7 de marzo de 2014

Práctica de cuentas bancarias. 3ª parte. GUI.

Pues al fin vamos a crear nuestro primer "programa visual", que es casi seguro lo que todos esperan crear cuando empiezan con esto de la programación ^^. Hoy seguiremos con nuestra práctica de cuentas bancarias de la otra vez (si no la hiciste, puedes descargarte los códigos, no te preocupes ;) ). Se desea desarrollar una aplicación gráfica que permita manipular una cuenta bancaria. La aplicación tendrá tres posibles vistas, las cuales implementarán todas la misma interfaz:
(Nota: en orden, las tres imagenes son  PanelCuenta1, PanelCuenta2 y PanelCuenta3)





import java.awt.event.*;
public interface VistaCuenta {
  String INGRESO = "INGRESO";
  String GASTO = "GASTO";
  String SALDO = "SALDO";
  /** Obtenemos la cantidad a ingresar
  * @return double con la cantidad a ingresar
  */
  double obtenerCantidad();
  /** Establecemos el saldo de la cuenta.
  * @param saldo double con el saldo de la cuenta.
  */
  void saldo(double saldo);
  /** Mostramos un mensaje de información.
  * @param msg String con el mensaje a mostrar.
  */
  void mensaje(String msg);
  /** Pasamos el controlador.
  */
  void controlador(ActionListener ctr);
  }

Aquí teneis el enunciado en pdf.
Las clases que implementan los diferentes paneles gráficos serán PanelCuentas1, PanelCuentas2 y PanelCuentas3, respectivamente.
Las tres deben implementar la interfaz VistaCuenta.
Para controlar los botones de ingresar, extraer y saldo implementar la clase CtrCuenta.
La clase CuentaDemo será la clase principal de la aplicación.

Debemos poder poner o quitar comentarios al panel que queremos utilizar y el resto debe funcionar.
      VistaCuenta vistaCuenta = new PanelCuenta1();
   // VistaCuenta vistaCuenta = new PanelCuenta2();
    //VistaCuenta vistaCuenta = new PanelCuenta3();

Observa que la segunda y la tercera versión no proporcionan un botón para consultar el saldo. En la tercera versión, el campo de texto en el que introducir la cantidad será no editable, forzando a que la cantidad se introduzca utilizando la botonera. Esta botonera será controlada desde el propio panel. Es decir, el panel implementará la interfaz ActionListener.
Aquí os pongo la demo:
import java.awt.event.ActionListener;
import javax.swing.*;


public class CuentaDemo {
 public static void main(String []args) {
  //creamos la vista
  //VistaCuenta vistaCuenta  = new PanelCuenta1();
  //VistaCuenta vistaCuenta  = new PanelCuenta2();
  VistaCuenta vistaCuenta  = new PanelCuenta3();
  
  // Creamos el modelo
  Cuenta cuenta = new Cuenta(0);
  //creamos el controlador pasandole la vista y el modelo
  ActionListener ctrCuenta = new ctrCuenta(vistaCuenta, cuenta);
  //Le decimos a la vista el nombre del controlador
  vistaCuenta.controlador(ctrCuenta);
  //Creamos el contenido superior
  JFrame ventana = new JFrame("Control de cuentas");
  
  ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  ventana.setContentPane((JPanel)vistaCuenta);
  ventana.pack();
  ventana.setVisible(true);
  }
}


Bueno pues aquí os pongo los códigos fuente:

Primero el del controlador ctrCuenta:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//Controlador
public class ctrCuenta implements ActionListener{
 
 //referencia al modelo
 private Cuenta cuenta;
 //referencia a la vista
 private VistaCuenta vistacuenta;
 //constructor que recibe a la vista y al modelo
 public ctrCuenta(VistaCuenta vc, Cuenta c) {
  cuenta = c;
  vistacuenta = vc;
 }
 
 
 public void actionPerformed(ActionEvent evento) {
  
  String command = evento.getActionCommand();
  
  if (command.equals(VistaCuenta.INGRESO)) {
   double cantidad = vistacuenta.obtenerCantidad();
   cuenta.ingresa(cantidad); 
   vistacuenta.saldo(cuenta.saldo());
   vistacuenta.mensaje("Ingreso de "+ cantidad + "€"+" realizado con éxito.");
   
  } else if(command.equals(VistaCuenta.GASTO)) {
   double cantidad = vistacuenta.obtenerCantidad();
   cuenta.extrae(cantidad);
   vistacuenta.saldo(cuenta.saldo());
   vistacuenta.mensaje("Pago de "+ cantidad + "€"+" realizado con éxito.");
   
  } else if(command.equals(VistaCuenta.SALDO)) {
   vistacuenta.mensaje("Su saldo es de "+ cuenta.saldo() + "€");
   
  }
 }
 
}

Ahora el de PanelCuenta1
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import javax.swing.*;


public class PanelCuenta1 extends JPanel implements VistaCuenta{
 private static final long serialVersionUID = 1L;

 private JButton saldoJB;
 private JButton extraerJB;
 private JButton ingresarJB;
 private JTextField cantidadJTF;
 private JLabel mensajeJL;
 private JLabel saldoJL;
 
 
 public PanelCuenta1() {
  //Creacion de los componentes
  saldoJB  = new JButton("SALDO");
  extraerJB  = new JButton("EXTRAER");
  ingresarJB  = new JButton("INGRESAR");
  cantidadJTF = new JTextField(10);
  mensajeJL  = new JLabel(" ");
  saldoJL  = new JLabel(" ");
  
  //Creacion del panel este.
  JPanel panelD = new JPanel();
  panelD.setLayout(new GridLayout(3,1)); //3 filas y 1 columna
  panelD.add(ingresarJB);
  panelD.add(extraerJB);
  panelD.add(saldoJB);
  
  //creo el panel central 
  JPanel panelC = new JPanel();
  panelC.setLayout(new GridLayout(2,2));
  panelC.add(new JLabel("Cantidad"));
  panelC.add(cantidadJTF);
  panelC.add(new JLabel("Saldo: "));
  panelC.add(saldoJL);
  
  //Montar el panel principal  
  setLayout(new BorderLayout());
  add(panelD, BorderLayout.EAST);
  add(panelC, BorderLayout.CENTER);
  add(mensajeJL, BorderLayout.SOUTH);
 }
  
 
 @Override
 public double obtenerCantidad() {
  
  return Double.parseDouble(cantidadJTF.getText());
 }

 @Override
 public void saldo(double saldo) {
  
  saldoJL.setText(String.format("%12.2f", saldo));
 }

 @Override
 public void mensaje(String msg) {
  
  mensajeJL.setText(msg);
 }

 @Override
 public void controlador(ActionListener ctr) {
  
  ingresarJB.addActionListener(ctr);
  ingresarJB.setActionCommand(INGRESO);
  saldoJB.addActionListener(ctr);
  saldoJB.setActionCommand(SALDO);
  extraerJB.addActionListener(ctr);
  extraerJB.setActionCommand(GASTO);
 }

 
 
 
 
 

}

El de PanelCuenta2:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;

import javax.swing.*;


public class PanelCuenta2 extends JPanel implements VistaCuenta{
 private static final long serialVersionUID = 1L;
 
 private JButton extraerJB;
 private JButton ingresarJB;
 private JTextField cantidadJTF;
 private JLabel saldoJL;
 private JLabel mensajeJL;
 
 public PanelCuenta2() {
  extraerJB  = new JButton("EXTRAER");
  ingresarJB  = new JButton("INGRESAR");
  cantidadJTF = new JTextField(10);
  saldoJL  = new JLabel(" ");
  mensajeJL = new JLabel(" ");
  
  //Panel Este
  JPanel panelEste = new JPanel();   // Creamos el panel
  panelEste.setLayout(new GridLayout(3, 1)); //2 filas, 1 columna
  panelEste.add(new JLabel("Saldo: "));
  panelEste.add(saldoJL);
  panelEste.add(mensajeJL);
  //Panel de Botones
  JPanel botonPanel = new JPanel();
  botonPanel.setLayout(new GridLayout(1, 2));
  botonPanel.add(ingresarJB);
  botonPanel.add(extraerJB);
  
  
  //Panel Oeste
  JPanel panelOeste = new JPanel();
  panelOeste.setLayout(new GridLayout(2, 1));
  panelOeste.add(cantidadJTF);
  panelOeste.add(botonPanel, BorderLayout.SOUTH);
  
  //Panel total
  setLayout(new GridLayout(1, 2));
  add(panelOeste, BorderLayout.WEST);
  add(panelEste, BorderLayout.EAST);
  
 }
 
 
 
 @Override
 public double obtenerCantidad() {
  
  return Double.parseDouble(cantidadJTF.getText());
 }
 @Override
 public void saldo(double saldo) {
  
  saldoJL.setText(String.format("%12.2f", saldo));
 }
 @Override
 public void mensaje(String msg) {
  
  mensajeJL.setText(msg);
 }
 @Override
 public void controlador(ActionListener ctr) {
  
  ingresarJB.addActionListener(ctr);
  ingresarJB.setActionCommand(INGRESO);
  extraerJB.addActionListener(ctr);
  extraerJB.setActionCommand(GASTO);
 }
 

}

Y el de PanelCuenta3:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


public class PanelCuenta3 extends JPanel implements ActionListener, VistaCuenta{
 private static final long serialVersionUID = 1L;
 
 private JButton b1JB;
 private JButton b2JB;
 private JButton b3JB;
 private JButton b4JB;
 private JButton b5JB;
 private JButton b6JB;
 private JButton b7JB;
 private JButton b8JB;
 private JButton b9JB;
 private JButton b0JB;
 private JButton ingresarJB;
 private JButton extraerJB;
 private JButton borrarJB;
 private JLabel saldoJL;
 private JTextField cantidadJTF;
 private JTextArea mensajesJTA;
 
 
 public PanelCuenta3() {
  b1JB = new JButton("1");
  b2JB = new JButton("2");
  b3JB = new JButton("3");
  b4JB = new JButton("4");
  b5JB = new JButton("5");
  b6JB = new JButton("6");
  b7JB = new JButton("7");
  b8JB = new JButton("8");
  b9JB = new JButton("9");
  b0JB = new JButton("0");
  ingresarJB = new JButton("INGRESAR");
  extraerJB = new JButton("EXTRAER");
  borrarJB = new JButton("Borrar");
  saldoJL = new JLabel(" ");
  cantidadJTF = new JTextField(" ");
  cantidadJTF.setEditable(false);
  mensajesJTA = new JTextArea(" ");
  
  b1JB.addActionListener(this);
  b2JB.addActionListener(this);
  b3JB.addActionListener(this);
  b4JB.addActionListener(this);
  b5JB.addActionListener(this); 
  b6JB.addActionListener(this);
  b7JB.addActionListener(this);
  b8JB.addActionListener(this);
  b9JB.addActionListener(this);
  b0JB.addActionListener(this);
  borrarJB.addActionListener(this);
  b1JB.setActionCommand("1");
  b2JB.setActionCommand("2"); 
  b3JB.setActionCommand("3");
  b4JB.setActionCommand("4"); 
  b5JB.setActionCommand("5"); 
  b6JB.setActionCommand("6");
  b7JB.setActionCommand("7");
  b8JB.setActionCommand("8");
  b9JB.setActionCommand("9");
  b0JB.setActionCommand("0");
  borrarJB.setActionCommand("BORRAR");
   
  //Panel números
  JPanel panelNum = new JPanel();
  panelNum.setLayout(new GridLayout(4,3));
  panelNum.add(b1JB);
  panelNum.add(b2JB);
  panelNum.add(b3JB);
  panelNum.add(b4JB);
  panelNum.add(b5JB);
  panelNum.add(b6JB);
  panelNum.add(b7JB);
  panelNum.add(b8JB);
  panelNum.add(b9JB);
  panelNum.add(b0JB);
  panelNum.add(new JLabel(" "));
  panelNum.add(borrarJB);
  
  //Panel de acciones
  JPanel panelAccion = new JPanel();
  panelAccion.setLayout(new GridLayout(2, 1));
  panelAccion.add(ingresarJB);
  panelAccion.add(extraerJB);
  
  //panel Central
  JPanel panelCentral = new JPanel();
  panelCentral.setLayout(new GridLayout(1, 2));
  panelCentral.add(panelNum);
  panelCentral.add(panelAccion);
  
  //Panel Saldo
  JPanel panelSaldo = new JPanel();
  panelSaldo.setLayout(new GridLayout(1, 2));
  panelSaldo.add(new JLabel("Saldo: "));
  panelSaldo.add(saldoJL);
  
  setLayout(new GridLayout(4, 1));
  add(cantidadJTF, BorderLayout.EAST);
  add(panelCentral, BorderLayout.EAST);
  add(panelSaldo, BorderLayout.EAST);
  add(mensajesJTA, BorderLayout.EAST);
  
 }
 
 
 @Override
 public double obtenerCantidad() {
  
  return Double.parseDouble(cantidadJTF.getText());
 }

 @Override
 public void saldo(double saldo) {
  
  saldoJL.setText(String.format("%12.2f", saldo));
 }

 @Override
 public void mensaje(String msg) {
  
  mensajesJTA.append(msg + "\n" + "\n");
 }

 @Override
 public void controlador(ActionListener ctr) {
  
  ingresarJB.addActionListener(ctr);
  ingresarJB.setActionCommand(INGRESO);
  extraerJB.addActionListener(ctr);
  extraerJB.setActionCommand(GASTO);
 }

 @Override
 public void actionPerformed(ActionEvent arg0) {
  String e = arg0.getActionCommand();
  
  if(e.equals("BORRAR")) {
   cantidadJTF.setText(" ");
  } else {
   int i = Integer.parseInt(e);
   cantidadJTF.setText(Integer.toString(
     i+10*Integer.parseInt( cantidadJTF.getText().equals(" ") ? "0" : cantidadJTF.getText())));
  }
  
 }
 

}

Espero que os haya gustado la práctica. Tampoco es muy complicado hacer una gui de estas. Es más cosa de diseñarla. Sin embargo la clase controladora (ctrCuenta) es muy similar a las que se usan en videojuegos para captar las acciones que hacemos.

Eso es todo gente. No dudeis en preguntar cualquier duda y hasta el Domingo.

Saludos ;)