Tutorial : Implementar funcionalidad de Formulario Productos – Parte 7.2

Nuestro formulario realiza las siguientes acciones :
1. Crear un nuevo producto.
2. Listar productos.
3. Eliminar un producto.
4. Editar un producto.
5. Exportar a MS Excel
6. Exportar en formato de impresión.
 

Bueno vamos a ir trabajando de acuerdo a lo que necesitemos, ya les he dicho que este no es un manual de buenas prácticas, hay muchas mejores formas de hacer todo esto, pero quiero dejarlo lo más sencillo posible.

Crear un nuevo producto.

Sencillo, es instanciar un objeto de nuestra clase Producto y asignar los valores de sus propiedades con lo que ingresemos en nuestros JtextField, al presionar Aceptar, hará toda la “magia”.

Esto creará un método que escucha las acciones que se realizan sobre el botón.
Como recordarán ya existe una explicación sobre nuestra clase Controladora ProductoControl

Por lo que nuestro código se reduce a esto :

Producto producto=new Producto();
producto.setCodigo(txtCodigo.getText().trim());
producto.setDescripcion(txtDescripcion.getText().trim());
producto.setPrecio(new BigDecimal(txtPrecio.getText().trim()));
try {
ProductoControl.crear(producto);
} catch (SQLException ex) {
Logger.getLogger(FrmProductos.class.getName()).log(Level.SEVERE, null, ex);
}

y para comprobar usamos el Editor SQL de Netbeans

Listar productos

Como verán en el post sobre la clase ProductoControl no hemos definido un método listar, en este caso haremos la implementación, para que entienda como funciona un Jtable en Swing, explicaré que un Jtable es un componente que muestra información tabulada que es obtenida de un objeto TableModel el cual maneja los datos que se cargarán.
Por lo tanto, necesitamos nuestro método listar el cual proveerá a nuestro modelo de los datos, vamos al código :

public static ArrayList<Producto> listar() throws SQLException{
final String query="select * from Producto";
ArrayList lista=new ArrayList();
java.sql.ResultSet rs=H2Util.getInstance().getResultSet(query);
while(rs.next()){
Producto obj=new Producto();
obj.setId(rs.getInt("ID"));
obj.setDescripcion(rs.getString("DESCRIPCION"));
obj.setCodigo(rs.getString("CODIGO"));
obj.setPrecio(rs.getBigDecimal("PRECIO"));
lista.add(obj);
}
return lista;
}

Ahora crearemos nuestro TableModel, este lo haremos heredando de AbstractTableModel, creamos una clase en nuestro paquete producto, y le denominamos ProductoTableModel
Este es su código :

public class ProductoTableModel extends AbstractTableModel {
ArrayList<Producto> data;
private String labels[] = {"ID", "CODIGO", "DESCRIPCION", "PRECIO"};

public ProductoTableModel(ArrayList<producto> data) {
this.data = data;
}
public ArrayList<producto> getData() {
return data;
}
public void setData(ArrayList<producto> data) {
this.data = data;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return labels.length;
}
@Override
public String getColumnName(int column) {
return labels[column];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Producto producto = data.get(rowIndex);
Object value = null;
switch (columnIndex) {
case 0:
value = producto.getId();
break;
case 1:
value = producto.getCodigo();
break;
case 2:
value = producto.getDescripcion();
break;
case 3:
value = producto.getPrecio();
break;
}
return value;
}

public Producto getRow(int rowIndex){
return data.get(rowIndex);
}
}

Primero definamos un campo productoTableModel para interactuar con el modelo de datos,

private ProductoTableModel productoTableModel;  

Bueno entonces configuremos nuestra tabla.

private void configurarTabla() {
try {
//Instanciamos nuestro productoTableModel y le pasamos los datos
productoTableModel = new ProductoTableModel(ProductoControl.listar());
//asignamos el modelo a nuestra tabla tblProductos
tblProductos.setModel(productoTableModel);
//Y removemos la columna 0 que contiene el ID de nuestros registros
tblProductos.removeColumn(tblProductos.getColumnModel().getColumn(0));
} catch (SQLException ex) {
Logger.getLogger(FrmProductos.class.getName()).log(Level.SEVERE, null, ex);
}
}

Si les queda duda como se pasan los datos, recuerden que cuando definimos el constructor de ProductoTableModel le pusimos un parámetro mediante el cual asignamos los valores al campo data de nuestro TableModel.
Llamamos a nuestro nuevo método dentro del constructor del Jframe.

public FrmProductos() {
initComponents();
configurarTabla();
}

Siguiente vamos a crear otro método donde actualizaremos nuestro modelo, asi cada vez que se inserte o actualice un dato de nuestra tabla de Productos, se actualiza en la tabla.

private void cargarTabla() throws SQLException {
productoTableModel.setData(ProductoControl.listar());
productoTableModel.fireTableDataChanged();
}

Ahora enlacemos esto cada vez que damos click en el botón Aceptar.
Final mente agregaremos este método en nuestro evento aceptar de manera que el código queda asi:

private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) {                                           
Producto producto = new Producto();
producto.setCodigo(txtCodigo.getText().trim());
producto.setDescripcion(txtDescripcion.getText().trim());
producto.setPrecio(new BigDecimal(txtPrecio.getText().trim()));
try {
ProductoControl.crear(producto);
cargarTabla();
} catch (SQLException ex) {
Logger.getLogger(FrmProductos.class.getName()).log(Level.SEVERE, null, ex);
} finally {
limpiarCampos();
}
}

Si se preguntan que es limpiarCampos solo es un método que vuelve los JtextFields con valores en blanco.

private void limpiarCampos() {
txtCodigo.setText("");
txtDescripcion.setText("");
txtPrecio.setText("");
}

Corrremos nuestra aplicación y ….

Eliminar un producto.

Primero debemos capturar el registro seleccionado y de preferencia mostrarlo en nuestro Panel Producto, entonces agregamos un listener a nuestra tabla que escuche nuestro evento cuando presionamos con el mouse., dentro le decimos que asigne el registro obtenido a un objeto producto que lo vamos a definir como campo de nuestro formulario.

public class FrmProductos extends javax.swing.JInternalFrame {
private Producto producto;

Y en nuestro evento.

private void tblProductosMousePressed(java.awt.event.MouseEvent evt) {
if (tblProductos.getModel().getRowCount() > 0) {
producto = ((ProductoTableModel) tblProductos.getModel()).getRow(tblProductos.getSelectedRow());
txtCodigo.setText(producto.getCodigo());
txtDescripcion.setText(producto.getDescripcion());
txtPrecio.setText(producto.getPrecio().toString());
}
}

Asignamos un evento a nuestro boton Eliminar.

Y en el código generado ingresamos lo siguiente:

private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) {
if (producto != null) {
try {
ProductoControl.borrar(producto.getId());
cargarTabla();
} catch (SQLException ex) {
Logger.getLogger(FrmProductos.class.getName()).log(Level.SEVERE, null, ex);
}finally{
limpiarCampos();
}
}
}

Editar Producto

Ya sabemos seleccionar un producto de nuestra tabla, asi que solo hay que saber cuando estamos registrando uno nuevo y cuando es una modificación dado que utilizamos el mismo boton Aceptar para ambos casos.
En este caso yo estoy utilizando lo siguiente, defino una variable tipo String llamada action, y cada vez que selecciono un producto, le asigno el valor MODIFICAR, luego en nuestro codigo aceptar valido que accion tomar de acuerdo a esta variable, nuestro codigo de seleccionar fila y aceptar quedan asi :

private void tblProductosMousePressed(java.awt.event.MouseEvent evt) {                                          
if (tblProductos.getModel().getRowCount() > 0) {
producto = ((ProductoTableModel) tblProductos.getModel()).getRow(tblProductos.getSelectedRow());
txtCodigo.setText(producto.getCodigo());
txtDescripcion.setText(producto.getDescripcion());
txtPrecio.setText(producto.getPrecio().toString());
action = "MODIFICAR";
}
}

El evento del boton Aceptar

private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) {                                           
if (producto == null) {
producto = new Producto();
}
producto.setCodigo(txtCodigo.getText().trim());
producto.setDescripcion(txtDescripcion.getText().trim());
producto.setPrecio(new BigDecimal(txtPrecio.getText().trim()));
try {
if (action.equals("MODIFICAR")) {
ProductoControl.editar(producto);
} else {
ProductoControl.crear(producto);
}
cargarTabla();
} catch (SQLException ex) {
Logger.getLogger(FrmProductos.class.getName()).log(Level.SEVERE, null, ex);
} finally {
limpiarCampos();
}
}

Hacemos unos cambios en limpiarCampos y queda asi :

private void limpiarCampos() {
txtCodigo.setText("");
txtDescripcion.setText("");
txtPrecio.setText("");
producto=null;
action="";
}

Aqui se puede ver en accion

Viene de  Creacion de Aplicación Java J2SE Swing con Netbeans IDE 7

El exportar a Excel y la impresión las veremos en el siguiente post.

[ACTUALIZADO]
Tutorial : Java Swing Exportar a Excel con Apache POI y JFileChooser – Parte 7.2.1

Deja un comentario