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

miércoles, 27 de septiembre de 2017

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

En un artículo anterior estuve explicando cómo crear un JComboBox 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 JComboBox con un objeto de nuestro modelo de datos declarado en el controlador.

Como estuvimos viendo, un JComboBox 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:

==> SwingUtils - Librería de Utilidades para Java Swing

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:

==> SwingUtils - Sincronizar datos de un JTextField con el Controlador (Java Swing)

El modelo de datos que usaremos para nuestro JComboBox 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;
    }

    @Override
    public String toString() {
        return nombre;
    }
    
}

Como vemos, es necesario sobrescribir los métodos toString(), equals() y hashCode().

El modelo de datos que usaremos para sincronizarlo con la vista será el siguiente:

public class MiModelo {

    private Pais pais;

    public Pais getPais() {
        return pais;
    }

    public void setPais(Pais pais) {
        this.pais = pais;
    }
    
}

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 JComboBox 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 JComboBox:

- ComboBoxView

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 JComboBox nos permiten trabajar con tipos de datos genéricos. Así pues, la forma de usar esta anotación sería la siguiente:

@ComboBoxView(name = "miModelo1.pais", required = true, requiredMessage = "Debe seleccionar un elemento")
private javax.swing.JComboBox<Pais> jComboBox1;
Además del nombre del componente (name), es posible usar también los atributos required y requiredMessage. El primero, es una propiedad booleana mediante la cual podemos indicar si queremos que sea obligatoria o no la selección de un elemento; y el segundo, es un mensaje personalizado que se mostrará al usuario en formato de error, en caso de que la propiedad required sea true y no se haya seleccionado ningún elemento del JComboBox.

Declaramos nuestro controlador en la vista e inyectamos la dependencia de ésta para poder sincronizarlos. Además setearemos el modelo de datos para nuestro JComboBox, para lo cual haremos uso de la clase JComboBoxUtils de la librería SwingUtils:

public class MiVista extends javax.swing.JFrame {
  
    private final MiControlador miControlador;
      
    public MiVista() {
        initComponents();
          
        this.miControlador = new MiControlador(this);
        
        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, "MX", "México"));
        
        JComboBoxUtils.setProperties(jComboBox1, listaPaises);
    }
      
}

Tal cual como lo vimos en el artículo sobre Cómo sincronizar un JTextField con el controlador, los datos los obtendríamos y seteariamos en la vista de la siguiente forma:

// Método para guardar los datos
public void guardar() {
    super.changeData(TipoUpdateEnum.MODEL);
    printConsole();
}
  
// Método para limpiar el formulario
public void limpiar() {
    miModelo1 = new MiModelo();
    super.changeData(TipoUpdateEnum.VIEW);
}
  
// Método para imprimir los datos por consola
public void printConsole() {
    System.out.println("País Seleccionado Modelo 1: " + miModelo1.getPais());
}

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.

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

Como podemos apreciar, usando la librería SwingUtils,  es muy rápido sincronizar fácilmente datos de un JComboBox 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