En un artículo anterior estuve explicando cómo crear un JTable en Java usando un Modelo de Datos genérico que nos provee la librería SwingUtils. Ahora veremos cómo sincronizar los datos de un JTable con un objeto de nuestro modelo de datos declarado en el controlador.
Como estuvimos viendo, un JTable nos permite trabajar con tipos de datos genéricos y dicho dato genérico es heredado por su modelo de datos, lo cual quiere decir que podemos trabajar incluso con tipos de datos de clases creadas por nosotros mismos.
Lo primero que debemos hacer es descargarnos la librería SwingUtils. Para hacerlo puedes revisar las instrucciones en el siguiente artículo:
Anotaciones para usar en el Controlador
Las anotaciones que podemos usar en el Controlador según sean nuestras necesidades son las siguientes:
- ModelBean
- PropertyController
Para saber como usar estas anotaciones puedes revisar esta misma sección de "Anotaciones para usar en el Controlador" en el siguiente artículo:
El modelo de datos que usaremos para nuestro JTable será el siguiente:
public class Pais { private Integer id; private String codigo; private String nombre; public Pais(Integer id, String codigo, String nombre) { this.id = id; this.codigo = codigo; this.nombre = nombre; } public Pais() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getCodigo() { return codigo; } public void setCodigo(String codigo) { this.codigo = codigo; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } @Override public int hashCode() { int hash = 7; hash = 13 * hash + Objects.hashCode(this.id); hash = 13 * hash + Objects.hashCode(this.codigo); return hash; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Pais other = (Pais) obj; if (!Objects.equals(this.codigo, other.codigo)) { return false; } if (!Objects.equals(this.id, other.id)) { return false; } return true; } }
El modelo de datos que usaremos para sincronizarlo con la vista será el siguiente:
Recuerda que los Getter y Setter de los atributos son requeridos para asignar y obtener el valor de los atributos.
- TableView
Como ya he mencionado, el tipo de dato del API de Java a usar en el modelo de datos puede ser de cualquier tipo, ya que los JTable nos permiten trabajar con tipos de datos genéricos. Así pues, la forma de usar esta anotación sería la siguiente:
Declaramos nuestro controlador en la vista e inyectamos la dependencia de ésta para poder sincronizarlos. Además setearemos el modelo de datos para nuestro JTable, para lo cual haremos uso de la clase JTableUtils de la librería SwingUtils:
La clase MiModeloTabla es el mismo modelo de datos que usamos en el artículo sobre cómo crear un JTable con un modelo de datos genérico, con la diferencia de que en este caso, lo inicializaremos con una lista vacía.
Tal cual como lo vimos en el artículo sobre Cómo sincronizar un JTextField con el controlador, los datos los podríamos obtener y setear de nuestro JTable en la vista de forma sencilla, sin embargo, para este ejemplo lo que queremos es mostrar dos listas diferentes mediante dos botones, así que los métodos que nos permitirán realizar esto serían ligeramente distintos:
Puedes revisar este artículo para comprender a fondo cómo funciona éste método super.changeData(), que como tal es el que realiza la actualización automática de los datos de la vista al modelo de datos en el controlador y viceversa. Como podemos apreciar también en el código, para limpiar o vaciar una tabla, es necesario setearle una lista vacía a la lista que tengamos en nuestro modelo de datos, o de lo contrario obtendremos una excepción de tipo java.lang.NullPointerException.
Como podemos apreciar, usando la librería SwingUtils, es muy rápido sincronizar fácilmente datos de un JTable con el Controlador para que la información de nuestra vista se actualice rápidamente en el modelo de datos y viceversa.
public class MiModelo { private List<Pais> listaPaises;; public List<Pais> getListaPaises() { return listaPaises; } public void setListaPaises(List<Pais> listaPaises) { this.listaPaises = listaPaises; } }
Recuerda que los Getter y Setter de los atributos son requeridos para asignar y obtener el valor de los atributos.
Anotaciones para usar en un JTable de Java Swing
La librería SwingUtils en su actual versión, permite asignar la siguiente anotación a un componente Java Swing de tipo JTable:- TableView
Como ya he mencionado, el tipo de dato del API de Java a usar en el modelo de datos puede ser de cualquier tipo, ya que los JTable nos permiten trabajar con tipos de datos genéricos. Así pues, la forma de usar esta anotación sería la siguiente:
@TableView(name = "miModelo1.pais") private javax.swing.JTablejTable1;
Declaramos nuestro controlador en la vista e inyectamos la dependencia de ésta para poder sincronizarlos. Además setearemos el modelo de datos para nuestro JTable, para lo cual haremos uso de la clase JTableUtils de la librería SwingUtils:
public class MiVista extends javax.swing.JFrame { private final MiControlador miControlador; public MiVista() { initComponents(); this.miControlador = new MiControlador(this); JTableUtils.setProperties(jTable1, new Font("Arial", Font.BOLD, 13), new MiModeloTabla()); jTable1.setSize(350, 250); JTableUtils.setAnchoColumnas(jTable1, jTable1.getWidth() - 1, 3, new int[]{20, 30, 50}); } private void initComponents() { // Código generado por NetBeans } }
La clase MiModeloTabla es el mismo modelo de datos que usamos en el artículo sobre cómo crear un JTable con un modelo de datos genérico, con la diferencia de que en este caso, lo inicializaremos con una lista vacía.
Tal cual como lo vimos en el artículo sobre Cómo sincronizar un JTextField con el controlador, los datos los podríamos obtener y setear de nuestro JTable en la vista de forma sencilla, sin embargo, para este ejemplo lo que queremos es mostrar dos listas diferentes mediante dos botones, así que los métodos que nos permitirán realizar esto serían ligeramente distintos:
// Método para obtener lista de países de Sudamérica public List<Pais> getListPaisesSudamerica() { List<Pais> listaPaises = new ArrayList<>(); listaPaises.add(new Pais(1, "CO", "Colombia")); listaPaises.add(new Pais(2, "AR", "Argentina")); listaPaises.add(new Pais(3, "VE", "Venezuela")); listaPaises.add(new Pais(4, "EC", "Ecuador")); listaPaises.add(new Pais(5, "PE", "Perú")); listaPaises.add(new Pais(6, "BO", "Bolivia")); listaPaises.add(new Pais(7, "PA", "Paraguay")); listaPaises.add(new Pais(8, "UR", "Uruguay")); listaPaises.add(new Pais(9, "CH", "Chile")); listaPaises.add(new Pais(10, "UR", "Brasil")); return listaPaises; } // Método para obtener lista de países de Europa public List<Pais> getListPaisesEuropa() { List<Pais> listaPaises = new ArrayList<>(); listaPaises.add(new Pais(1, "ES", "España")); listaPaises.add(new Pais(2, "FR", "Francia")); listaPaises.add(new Pais(3, "GE", "Alemania")); listaPaises.add(new Pais(4, "EN", "Inglaterra")); listaPaises.add(new Pais(5, "HO", "Holanda")); listaPaises.add(new Pais(6, "SU", "Suecia")); listaPaises.add(new Pais(7, "NO", "Noruega")); listaPaises.add(new Pais(8, "BE", "Bélgica")); return listaPaises; } // Método para mostrar en la tabla la lista de países de Sudamérica public void verPaisesSudamerica() { miModelo1.setListaPaises(getListPaisesSudamerica()); super.changeData(TipoUpdateEnum.VIEW); } // Método para mostrar en la tabla la lista de países de Europa public void verPaisesEuropa() { miModelo1.setListaPaises(getListPaisesEuropa()); super.changeData(TipoUpdateEnum.VIEW); } // Método para limpiar los datos public void limpiar() { miModelo1 = new MiModelo(); miModelo1.setListaPaises(new ArrayList<>()); super.changeData(TipoUpdateEnum.VIEW); }
Puedes revisar este artículo para comprender a fondo cómo funciona éste método super.changeData(), que como tal es el que realiza la actualización automática de los datos de la vista al modelo de datos en el controlador y viceversa. Como podemos apreciar también en el código, para limpiar o vaciar una tabla, es necesario setearle una lista vacía a la lista que tengamos en nuestro modelo de datos, o de lo contrario obtendremos una excepción de tipo java.lang.NullPointerException.
Como podemos apreciar, usando la librería SwingUtils, es muy rápido sincronizar fácilmente datos de un JTable con el Controlador para que la información de nuestra vista se actualice rápidamente en el modelo de datos y viceversa.
No hay comentarios.:
Publicar un comentario