Categoría: Java Swing

Ejercicio UT2E1 – Codificando en Swing

Crea una pequeña aplicación que contenga cuatro cuadros de texto, una etiqueta y dos botones: comprobar y salir.

El usuario podrá introducir cuatro palabras en los cuadros de texto. Al pulsar el botón «comprobar», en la etiqueta aparecerá un mensaje que indicará si hay textos repetidos en dos o más cuadros de texto. Ten en cuenta que debe mostrar únicamente un mensaje, por lo que habrá 11 combinaciones diferentes.

En caso de pulsar el botón «Salir» se saldrá de la aplicación.

Trata de hacerlo de la manera más eficiente posible.

Nomenclatura de componentes Swing

En general, para definir elementos de Java Swing debemos eliminar las J inicial y las vocales, y extraer las tres consonantes más significativas del nombre del control. A continuación figura la lista de componentes y sus prefijos asociados:

1. Nomenclatura de Swing Containers
Contenedor Prefijo
JInternalFrame ifrm
JPanel pan
JScrollPane scp
JTabbedPane tpn
JToolBar tlb
2. Nomenclatura de Swing Controls
Control Prefijo
JButton btn
JButtonGroup btg
JCheckBox cbx
JComboBox cmb
JLabel lbl
JList lst
JPasswordField pwd
JProgressBar pgb
JScrollBar scb
JTable tbl
JTextArea txa
JTextField txt
JTextPane txp
JTree jt
JDateChooser jdc
JCalendar jcl
JRadioButton jrb
3. Nomenclatura de Swing Menus
Menu Prefijo
JMenu mnu
JMenuBar mnb
JMenuItem mni
4. Nomenclatura de Swing Windows
Window Prefijo
JColorChooser cch
JDialog dlg
JFileChooser jfc
JFrame frm
JOprionPane opt
5. Otros
Window Prefijo
DefaultTableModel dtm
JDialog dlg
JFileChooser jfc
JFrame frm
JOprionPane opt

Crear diálogos modales en Java Swing

Un diálogo modal respecto al sistema es una ventana que no va ceder el foco a ninguna otra aplicación hasta que se produzca una determinada acción sobre él. Por ejemplo, podríamos utilizarlos en caso de que dispongamos de un JFrame que abre una nueva ventana y al que no podemos acceder a menos que cerremos dicha ventana.

Para ello, hay que tener en cuenta que esa nueva ventana que abrimos no puede ser un JFrame, sino un JDialog. El procedimiento es el siguiente:

  • Hemos definido un JDialog con los componentes que deseemos. Su constructor dispondrá de dos parámetros: parent y modal, que indican el padre del JDialog, y si la ventana es modal (hasta que no se cierre no podemos acceder al padre) o no modal.

public DialogSalonHabana(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
}

  • La ventana principal dispone de un envento que permite abrir el nuevo JDialog, con el siguiente código:

private void mniNuevaVentanaActionPerformed(java.awt.event.ActionEvent evt) {
NuevaVentanaDialog nv = new NuevaVentanaDialog(this,true);
JDialog jd = new JDialog(nv, «Dialogo modal», Dialog.ModalityType.DOCUMENT_MODAL);
nv.setVisible(true);
}

De este modo, cuando mediante el evento mniNuevaVentanaActionPerformed  abramos una ventana NuevaVentanaDialog, no podremos volver a la ventana principal hasta que ésta no sea cerrada.

Proyecto conjunto con GitHub y HR

Basándonos en el componente de acceso a datos de HR creado en el módulo Acceso a Datos, y poniendo en práctica todo lo aprendido hasta ahora con Java Swing debéis poneros de acuerdo para crear un equipo de desarrollo donde integréis todos los elementos utilizando el repositorio GitHub.

Los diferentes perfiles de desarrollo que utilizaréis son los siguientes:

  • Diseñador-programador (3 personas): es el trabajador encargado del diseño de los componentes de Java Swing de modo que todos tengan un aspecto y funcionalidad similar y cumplan con los estándares de usabilidad. No deben olvidar la asignación de nombres siguiendo los estándares para cada uno de los elementos (deben coordinarse para seguir la misma nomenclatura). Una vez diseñados estos componentes deberán continuar su trabajo de programadores.
  • Revisor-programador (3 personas): una vez desarrollados los componentes, se encargarán de comprobar que funcionan correctamente. Además, deben realizar la función de programadores.
  • Jefe de operación (3 personas): encargado de planificar el trabajo a realizar, la asignación de recursos humanos en cada puesto de trabajo y en cada momento. Además, realiza los procesos de programador.

 

Formulario de región

Cargar datos de una base de datos en un formulario

Mucho más sencillo que cargar datos de una tabla: para cargar datos de un formulario únicamente tendremos que ejecutar el método de consulta de datos de HR que necesitemos y mostrar dichos datos en los campos de texto correspondientes.

Al igual que en en caso anterior, dentro del método public nombreJPanel(), además de llamar al método initComponents; llamaremos a cargarFormulario(); El método cargar Formulario será público y no devolverá nada.

Finalmente, accedemos a la base de datos y ejecutamos el método que extraiga los datos de la misma. Cargamos cada dato en el campo de texto correspondiente y ¡listo!

public void cargarForm(){
   try {
      Hr hr = new Hr();
      Region r = hr.consultarRegion(Integer.parseInt("3"));
      this.txtPais.setText(r.getRegionName());
      this.txtCodigo.setText(String.valueOf(r.getRegionId()));
   } catch (ExcepcionHr ex) {
   System.out.println(ex.getMensajeErrorUsuario());
   }
}
JTable con datos de HR

Cargar datos de una base de datos en un JTable

Ya que en Acceso a Datos trabajamos con la base de datos HR, vamos a reuilizar uno de sus métodos para completar un jTable de nuestro formulario. Para ello debemos añadir en un JFrame un jTable y crearnos un modelo de datos de tipo DefaultTableModel en la clase de nuestro JFrame.

DefaultTableModel dtmModelo;

Además, dentro del método public nombreJPanel () además de llamar al método initComponents; llamaremos también a cargarTabla();

El método cargarTabla será público y no devolverá nada.

En primer lugar deberá definir el modelo DefaultTableModel para que no pueda ser editado por el usuario.

this.dtmModelo = new DefaultTableModel() {
   @Override
      public boolean isCellEditable(int fila, int columna) {
         return false; //Con esto conseguimos que la tabla no se pueda editar
      }
  };

A continuación asignamos dicho modelo a la tabla:

this.tblTabla = new JTable(dtmModelo);

Al modelo le añadimos los nombres de columnas que vamos a necesitar. En este caso, de Regiones tomaremos el ID y el nombre de la región.

this.dtmModelo.addColumn("ID");
this.dtmModelo.addColumn("Region");

Seguidamente realizamos la conexión a la base de datos HR y obtenemos, en este caso, el ArrayList de regiones que se lo asignaremos a una variable de tipo ArrayList.

Hr hr = new Hr();
ArrayList<Region> listaRegiones = hr.listarRegions();

Seguidamente hacemos un bucle para recorrer esta lista de regiones, definiéndonos una fila en la que indicaremos el número de columnas que vamos a utilizar y asignándole a las posiciones de la fila la información extraida del array. Finalmente, en cada pasada del bucle añadirmos la fila al modelo:

for (int i = 0; i < listaRegiones.size(); i++) {
   Object[] fila = new Object[2];
   fila[0]= listaRegiones.get(i).getRegionId();
   fila[1]= listaRegiones.get(i).getRegionName();
   this.dtmModelo.addRow(fila);
}

Para actualizar la información será necesario realizar el método updateUI a la tabla y a continuación ejecutar el método setViewportView del JScrollPane para actualizar la información que contiene.

this.tblTabla.updateUI();
this.scpScrollPane.setViewportView(tblTabla);

¡No olvides implementar el try-catch correspondiente! De lo contrario te dará error.