jueves, 24 de julio de 2008

Aplicaciones Java (IV): Swing: tablas y diálogos

Más formas para mostrar información: tablas y diálogos.

Tablas (JTable, DefaultTableModel)

La clase JTable nos permitirá crear matrices de celdas donde podremos insertar texto, botones, o cualquier otro componente.

final String[] columnNames = {"number", "string 1", "string 2"};
final Object[][] data = {};

JTable tabla = new JTable(new DefaultTableModel(data, columnNames));
root.add(new JScrollPane(tabla), BorderLayout.CENTER);

En el ejemplo anterior hemos utilizado el modelo de tabla "DefaultTableModel". Si queremos personalizar el comportamiento de la tabla, podemos crear una clase que herede de DefaultTableModel, sobreescribiendo algunos de sus métodos.

En el siguiente ejemplo utilizamos este método para hacer que trate la primera columna como objetos de tipo Integer, y las demás como String, frente al comportamiento por defecto que es tratar todas las columnas como objetos de tipo Object. Esto afecta por ejemplo a la ordenación de las columnas cuando hacemos una llamada a setAutoCreateRowSorter.

final String[] columnNames = {"number", "string 1", "string 2"};
final Object[][] data = {};

final class WordListTableModel extends DefaultTableModel
{
 private static final long serialVersionUID = 4;
 
    public WordListTableModel(Object[][] data, Object[] columnNames) {
        super(data, columnNames);
    }

    public Class getColumnClass(int columnIndex) {
     if (columnIndex == 0) return Integer.class;
     else return String.class;
    }
}

tabla = new JTable(new WordListTableModel(data, columnNames));
tabla.setAutoCreateRowSorter(true);
root.add(new JScrollPane(tabla), BorderLayout.CENTER);

Para añadir datos a una tabla podemos utilizar el método addRow:

Object[] row = {Integer.valueOf(123), "any value", "botón pulsado"};
((DefaultTableModel)tabla.getModel()).addRow(row);

Diálogos (JDialog)

Los diálogos nos permitirán mostrar ventanas emergentes con información u opciones adicionales. Ejemplos sencillos de diálogos serían:

  • Diálogos de "Acerca de" con información sobre el programa, página web, autor, etc.
  • Un diálogo emergente que aparezca cuando ejecutamos una operación larga, y que incluya una barra de progreso y un botón para cancelar la operación.

Crearemos diálogos por medio de la clase JDialog. También hay otras formas de crearlos, como utilizando la clase JOptionPane.

Hay un problema a la hora de crear un diálogo desde un applet. El objeto raiz es de la clase JApplet, que no desciende de la clase Frame, necesario para poder crear un objeto JDialog. Para solucionarlo, utilizaremos el método getFrameForComponent de la clase JOptionPane, que nos permitirá obtener el objeto del tipo Frame del que es nieto el applet. En el caso de una aplicación, el objeto root ya es un Frame, con lo que getFrameForComponent devolverá el mismo objeto, de modo que podemos utilizar el mismo código para la ejecución como applet y como aplicación:

JDialog dialog = new JDialog(JOptionPane.getFrameForComponent(root), "botón pulsado!!!", Dialog.ModalityType.APPLICATION_MODAL);
dialog.add(new JLabel("line correctly added"));
dialog.pack();
dialog.setVisible(true);

Material

El código fuente mostrando el uso de estos componentes se puede descargar bajo licencia GPLv3:
Download

Ejecutar ejemplo, como applet o como Java Web Start (recomendado):
Start Applet Launch via Java Web Start

No hay comentarios: