Por favor, activa JavaScript y desactiva tu adblock para este sitio

El Javatar

Blog dedicado a la Programación en Java, C, PHP, Phyton, HTML, SQL y Mucho Más

jueves, 16 de noviembre de 2017

SwingUtils - Sincronizar datos de un JTable con el Controlador (Java Swing)

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:

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.JTable jTable1;

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.

SwingUtils - Sincronizar datos de un JTable con el Controlador (Java Swing)

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