Para terminar el tutorial, debemos unir tanto la VISTA como el MODELO y para eso esta el CONTROLADOR. o.O
El controlador. Responde a los eventos que el usuario realiza a través de la VISTA y en algunos casos directamente en el MODELO. El controlador como su nombre indica 🙂 , controla los eventos generados por el usuario pasando estos hacia el modelo esperando una respuesta de este para después devolver el resultado en la VISTA que corresponda.
El paquete correspondiente al controlador en nuestra aplicación, consta de dos clases, la clase controlador.java y el Main.java
La clase controlador es la siguiente:
package controlador; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Date; import java.util.Map; import java.util.HashMap; import javax.swing.DefaultComboBoxModel; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.table.DefaultTableModel; //Logica de aplicación -> MODELO import modelo.carrito; import modelo.modelo; import modelo.producto; //interfaz de usuario -> VISTA import vista.frmConsulta; import vista.frmPrincipal; import vista.frmProducto; import vista.frmVenta; /** * @web https://www.jc-mouse.net * @author Mouse */ public class jcontrolador implements ActionListener,MouseListener{ //vista private frmPrincipal frmprincipal ; private frmProducto frmproducto = new frmProducto(); private frmVenta frmventa = new frmVenta(); private frmConsulta frmconsulta = new frmConsulta(); //modelo private modelo mimodelo = new modelo(); //variable para almacenar los productos de una venta private Map carrito_compra = new HashMap(); //acciones que se ejecuta por los controles de cada VISTA public enum Accion { __VER_PRODUCTOS, //-> Abre VISTA productos __VER_NUEVA_VENTA, //abre VISTA nueva venta __VER_NUEVA_COMPRA, //abre VISTA nueva compra __CONSULTAS, //-> Abre VISTA para realizar consultas __AGREGAR_PRODUCTO,//-> Ejecuta consulta __ACTUALIZAR_PRODUCTO,//-> Ejecuta consulta __NUEVA_VENTA,//-> genera un codigo al azar y limpia controles __lista_productos,//->se ejecuta cuando se hace clic en el jcombobox de productos de VISTA frmVenta __AGREGAR_A_LISTA,//->asigna un producto al carrito de compras __REMOVER_PRODUCTO,//-> remueve un producto del carrito de compras __REGISTRAR_VENTA,//-> registra una venta en la base de datos __PROCESAR_CONSULTA, //-> Ejecuta consulta -> busqueda de venta por ID __PROCESAR_CONSULTA2//-> Ejecuta consulta -> busqueda de venta por rango de fechas } /** Constructor de clase */ public jcontrolador( JFrame padre ) { this.frmprincipal = (frmPrincipal) padre; } //EVENTOS DEL RATON SOBRE LOS COMPONENTES public void mouseClicked(MouseEvent e) { if( e.getButton()== 1)//boton izquierdo { int fila = this.frmproducto.__TABLA_PRODUCTO.rowAtPoint(e.getPoint()); if (fila > -1){ this.frmproducto.__id.setText( String.valueOf( this.frmproducto.__TABLA_PRODUCTO.getValueAt(fila, 0) )); this.frmproducto.__nombre.setText( String.valueOf( this.frmproducto.__TABLA_PRODUCTO.getValueAt(fila, 1) )); this.frmproducto.__precio.setText( String.valueOf( this.frmproducto.__TABLA_PRODUCTO.getValueAt(fila, 2) )); this.frmproducto.__cantidad.setText( String.valueOf( this.frmproducto.__TABLA_PRODUCTO.getValueAt(fila, 3) )); this.frmproducto.__lista_categorias.setSelectedItem( String.valueOf( this.frmproducto.__TABLA_PRODUCTO.getValueAt(fila, 4) ) ); } } } public void mousePressed(MouseEvent e){/** nada por aqui */} public void mouseReleased(MouseEvent e){/** nada por aqui */} public void mouseEntered(MouseEvent e){/** nada por aqui */} public void mouseExited(MouseEvent e){/** nada por aqui */} /** Inicia todos las acciones y listener de la vista */ public void iniciar() { //frmprincipal.setVisible(true); //si no se utiliza SKIN // Skin tipo WINDOWS try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); SwingUtilities.updateComponentTreeUI(frmprincipal); SwingUtilities.updateComponentTreeUI( this.frmproducto ); SwingUtilities.updateComponentTreeUI( this.frmventa ); SwingUtilities.updateComponentTreeUI( this.frmconsulta ); this.frmprincipal.setLocationRelativeTo(null); this.frmprincipal.setTitle("Control de Inventario - https://www.jc-mouse.net/"); this.frmprincipal.setVisible(true); } catch (UnsupportedLookAndFeelException ex) {} catch (ClassNotFoundException ex) {} catch (InstantiationException ex) {} catch (IllegalAccessException ex) {} //boton this.frmprincipal.__VER_PRODUCTOS.setActionCommand( "__VER_PRODUCTOS" ); this.frmprincipal.__VER_PRODUCTOS.addActionListener(this); //boton this.frmprincipal.__VER_NUEVA_VENTA.setActionCommand( "__VER_NUEVA_VENTA" ); this.frmprincipal.__VER_NUEVA_VENTA.addActionListener(this); //boton this.frmprincipal.__VER_NUEVA_COMPRA.setActionCommand( "__VER_NUEVA_COMPRA" ); this.frmprincipal.__VER_NUEVA_COMPRA.addActionListener(this); //boton this.frmprincipal.__CONSULTAS.setActionCommand("__CONSULTAS"); this.frmprincipal.__CONSULTAS.addActionListener(this); //escucha eventos del raton sobre la tabla this.frmproducto.__TABLA_PRODUCTO.addMouseListener(this); //comando y listener para boton agregar producto this.frmproducto.__AGREGAR_PRODUCTO.setActionCommand("__AGREGAR_PRODUCTO"); this.frmproducto.__AGREGAR_PRODUCTO.addActionListener(this); //comando y listener para boton actualizar producto this.frmproducto.__ACTUALIZAR_PRODUCTO.setActionCommand("__ACTUALIZAR_PRODUCTO"); this.frmproducto.__ACTUALIZAR_PRODUCTO.addActionListener(this); //boton VISTA frmVenta this.frmventa.__NUEVA_VENTA.setActionCommand("__NUEVA_VENTA"); this.frmventa.__NUEVA_VENTA.addActionListener(this); //jcombobox frmVenta this.frmventa.__lista_productos.setActionCommand("__lista_productos"); this.frmventa.__lista_productos.addActionListener(this); //boton frmVenta this.frmventa.__AGREGAR_A_LISTA.setActionCommand("__AGREGAR_A_LISTA"); this.frmventa.__AGREGAR_A_LISTA.addActionListener(this); //boton frmVenta this.frmventa.__REMOVER_PRODUCTO.setActionCommand("__REMOVER_PRODUCTO"); this.frmventa.__REMOVER_PRODUCTO.addActionListener(this); //botn frmVenta this.frmventa.__REGISTRAR_VENTA.setActionCommand("__REGISTRAR_VENTA"); this.frmventa.__REGISTRAR_VENTA.addActionListener(this); //boton frmConsulta this.frmconsulta.__PROCESAR_CONSULTA.setActionCommand("__PROCESAR_CONSULTA"); this.frmconsulta.__PROCESAR_CONSULTA.addActionListener(this); //boton frmConsulta this.frmconsulta.__PROCESAR_CONSULTA2.setActionCommand("__PROCESAR_CONSULTA2"); this.frmconsulta.__PROCESAR_CONSULTA2.addActionListener(this); } /** Gestion de accciones */ public void actionPerformed(ActionEvent e) { switch ( Accion.valueOf( e.getActionCommand() ) ) { case __VER_PRODUCTOS: this.frmproducto.setLocationRelativeTo(null); this.frmproducto.setTitle("PRODUCTOS - https://www.jc-mouse.net/"); this.frmproducto.setVisible(true); this.frmproducto.__TABLA_PRODUCTO.setModel( this.mimodelo.getTablaProducto() ); this.frmproducto.__lista_categorias.setModel( this.mimodelo.getListaCategorias() ); break; case __VER_NUEVA_VENTA: this.frmventa.setLocationRelativeTo(null); this.frmventa.setTitle("VENTA DE PRODUCTOS - https://www.jc-mouse.net/"); this.frmventa.__id_venta.setText( this.mimodelo.getRandomCode() ); this.frmventa.__fecha_venta.setText( this.mimodelo.getFecha() ); this.frmventa.__lista_productos.setModel( this.mimodelo.getListaProductos() ); this.frmventa.__lista_clientes.setModel( this.mimodelo.getListaClientes() ); this.carrito_compra.clear(); this.frmventa.__detalle_productos.setModel(new DefaultComboBoxModel()); this.frmventa.setVisible(true); break; case __VER_NUEVA_COMPRA: JOptionPane.showMessageDialog(null,"you can do it"); break; case __CONSULTAS: this.frmconsulta.setLocationRelativeTo(null); this.frmconsulta.setTitle("Consultas - https://www.jc-mouse.net/"); this.frmconsulta.__fecha1.setDateFormatString("yyyy-MM-dd"); this.frmconsulta.__fecha2.setDateFormatString("yyyy-MM-dd"); this.frmconsulta.__fecha1.setDate( new Date() ); this.frmconsulta.__fecha2.setDate( new Date() ); this.frmconsulta.setVisible(true); break; //----------------------------------------------------------------- Soy una barra separadora pobre :) case __AGREGAR_PRODUCTO: //obtiene ID de producto String cat[] = this.frmproducto.__lista_categorias.getSelectedItem().toString().split("-"); if ( this.mimodelo.NuevoProducto( this.frmproducto.__id.getText(), this.frmproducto.__nombre.getText() , this.frmproducto.__precio.getText(), this.frmproducto.__cantidad.getText() , cat[0].trim() ) ) { this.frmproducto.__TABLA_PRODUCTO.setModel( this.mimodelo.getTablaProducto() ); //actualiza JTable JOptionPane.showMessageDialog(null,"Nuevo producto agregado"); } else JOptionPane.showMessageDialog(null,"Error: Verifique los datos del nuevo producto"); break; case __ACTUALIZAR_PRODUCTO: String cat2[] = this.frmproducto.__lista_categorias.getSelectedItem().toString().split("-"); if( this.mimodelo.ActualizarProducto( this.frmproducto.__id.getText(), this.frmproducto.__nombre.getText() , this.frmproducto.__precio.getText(), this.frmproducto.__cantidad.getText() , cat2[0].trim() )) { this.frmproducto.__TABLA_PRODUCTO.setModel( this.mimodelo.getTablaProducto() ); //actualiza JTable JOptionPane.showMessageDialog(null,"Registro actualizado"); } break; //----------------------------------------------------------------- Soy una barra separadora pobre :) case __NUEVA_VENTA: //asigna un nuevo codigo aleatorio al control this.frmventa.__id_venta.setText( this.mimodelo.getRandomCode() ); //muestra la fecha actual en el control this.frmventa.__fecha_venta.setText( this.mimodelo.getFecha() ); //limpia carrito MAP, jcombobox y demas controles this.carrito_compra.clear(); this.frmventa.__detalle_productos.setModel(new DefaultComboBoxModel()); this.frmventa.__cantidad.setText("0"); this.frmventa.__idp.setText(""); this.frmventa.__stock.setText("0"); this.frmventa.__precio_unidad.setText("0"); this.frmventa.__total.setText("0" ); this.frmventa.__detalle.setText(""); this.frmventa.__REGISTRAR_VENTA.setEnabled(true); break; case __lista_productos://cuando se hace clic en algun producto del form VENTA //obtiene datos de producto producto tmp = this.mimodelo.getProducto( this.frmventa.__lista_productos.getSelectedItem().toString() ); //coloca los datos en los controles this.frmventa.__idp.setText( String.valueOf( tmp.getId() ) ); this.frmventa.__stock.setText( String.valueOf( tmp.getStock()) ); this.frmventa.__precio_unidad.setText( String.valueOf( tmp.getPrecio() ) ); break; case __AGREGAR_A_LISTA: //controla que se halla seleccionado un producto y if( !this.frmventa.__idp.getText().equals("") && !this.frmventa.__cantidad.getText().equals("0")) { //controla stock de producto if( Integer.valueOf(this.frmventa.__stock.getText()) > Integer.valueOf(this.frmventa.__cantidad.getText()) ) { //nueva instancia a carrito de compras, se cargan datos en la clase carrito tmp_carrito = new carrito(); tmp_carrito.setIdproducto( this.frmventa.__idp.getText() ); tmp_carrito.setDescripcion( this.frmventa.__lista_productos.getSelectedItem().toString() ); tmp_carrito.setPrecio( this.frmventa.__precio_unidad.getText() ); tmp_carrito.setCantidad( this.frmventa.__cantidad.getText() ); //se añade clase a MAP this.carrito_compra.put( this.frmventa.__idp.getText() , tmp_carrito); //segun el MAP se actualiza la vista del jcombobox this.frmventa.__detalle_productos.setModel( this.mimodelo.ListaProductos(carrito_compra) ); //asigna el total de la venta en control this.frmventa.__total.setText( "" + this.mimodelo.getTotalVenta(carrito_compra) ); } else JOptionPane.showMessageDialog(null,"Error: No existe stock suficiente para este producto."); } else JOptionPane.showMessageDialog(null,"Error: Verifique sus datos"); break; case __REMOVER_PRODUCTO: JOptionPane.showMessageDialog(null,"you can do it"); break; case __REGISTRAR_VENTA: //comprueba que existan productos en el carrito if( !this.carrito_compra.isEmpty()) { //obtiene ID del cliente String idcliente[] = this.frmventa.__lista_clientes.getSelectedItem().toString().split("-"); if ( this.mimodelo.RegistrarVenta(this.frmventa.__id_venta.getText(), carrito_compra, this.frmventa.__total.getText(), this.frmventa.__detalle.getText(), idcliente[1].trim() )) { JOptionPane.showMessageDialog(null,"Nueva Venta registrada"); this.frmventa.__REGISTRAR_VENTA.setEnabled(false); } } else JOptionPane.showMessageDialog(null,"Error: Sin productos."); break; //----------------------------------------------------------------- Soy una barra separadora pobre :) case __PROCESAR_CONSULTA: String r = this.mimodelo.getDatosVenta(this.frmconsulta.__idventa.getText()); if( !r.equals("") ) { this.frmconsulta.__resultadoTabla.setModel( this.mimodelo.getTablaVenta( this.frmconsulta.__idventa.getText() ) ); this.frmconsulta.__resultadoTexto.setText( r ); } else { this.frmconsulta.__resultadoTabla.setModel( new DefaultTableModel() ); this.frmconsulta.__resultadoTexto.setText( "" ); JOptionPane.showMessageDialog(null,"No existen registros"); } break; case __PROCESAR_CONSULTA2: this.frmconsulta.__resultadoTabla.setModel( this.mimodelo.getDatosVentaxFechas( this.frmconsulta.__fecha1.getDate(), this.frmconsulta.__fecha2.getDate() ) ); this.frmconsulta.__resultadoTexto.setText(""); break; }//-> fin case } }
Y finalmente la clase Main.java que lanza toda la aplicación.
package controlador; /** * @web https://www.jc-mouse.net/ * @author Mouse */ import vista.frmPrincipal; public class Main { public static void main(String[] args) { //se ejecuta controlador new jcontrolador( new frmPrincipal() ).iniciar(); } }
Solo nos queda ejecutar el proyecto y ver si tenemos algún error.
Todas las clases están comentadas y espero que todo lo explicado en estos 5 post pueda ser entendido sin problemas para que puedan desarrollar el proyecto, sino 🙂 espero que se diviertan averiguando como funciona la aplicación 🙂
El código del proyecto AQUI 🙂
Un JList nos permite almacenar objetos en una lista y mostrarlos gráficamente en una serie vertical en el cual el usuari[...]
Una Prueba Unitaria, es una forma de comprobar que nuestro código, hace lo que se supone debe hacer; es decir, se asegur[...]
El índice TIOBE (TIOBE, The Importance of Being Earnest – «La importancia de ser honesto» – referencia a la[...]
Una vez que terminamos el obligatorio 🙂 «Hola mundo«, podemos crear aplicaciones un tanto más elaboradas, pero para nada[...]
En este post veremos un ejemplo sencillo de encriptación/desencriptación simétrica que el API de Java nos permite realiz[...]
SQLite es un sistema de gestión de bases de datos relacional, escrita en C, si se desea hacer uso de encriptación con S[...]