Downloading tutorial.
Ok, estas usando java, quieres hacer una aplicación de escritorio y tu aplicación lleva tablas y botones y cositas por aqui y por allá y no sabes por donde empezar. Es entonces cuando te das cuenta
Swing es una bestia.
Swing es feo.
Swing es incomprendido.
Ok, Ahora vamos a ver un poco sobre tablas y como manejarlas para que hagan lo que tu quieres y no lo que ellas quieran.
La tabla es un componente muy complejo pero muy util en interfaces les permite desplegar muchos datos de un solo golpe, sin embargo no son tan sencillas como uno desearia.
Las tablas empiezan siempre por algo sencillo como:
package net.edzero.tableDemo;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class MainClass {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTable table = new JTable(3, 3);
JScrollPane tableScroll = new JScrollPane(table);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(tableScroll, BorderLayout.CENTER);
frame.setVisible(true);
}
}
Ok paso 1. una de dos o extendemos la tabla o le hacemos un metodo para crear una tabla de otra manera la cosa se va a poner fea despues por que vamos a tener mucho codigo.
creamos la clase CustomTable y cambiamos la linea:
JTable table = new JTable(3,3);
por
JTable table = new CustomTable();
y ahora tenemos un lugar donde hacer nuestro codigo “real”
package net.edzero.tableDemo;
import javax.swing.JTable;
public class CustomTable extends JTable {
private static final long serialVersionUID = 1L;
public CustomTable() {
}
}
muchas veces en swing se usa esta forma para personalizar componentes, en vez de meter el codigo de personalización en un método se prefiere heredar un componente y ahi poner el codigo de personalización ya que esto da como resultado un componente reusable y nos permite estructurar mejor el código.
Ok ahora a lo que nos truje. Parte 1.
EL MODELO DE DATOS
Las tablas usan modelos de datos para mostrar los datos en pantalla, estos datos se almacenan en un modelo, hay un par de reglas a seguir en este negocio.
- El modelo de datos a usar se debe de colocar una vez y despues solo modificarlo para asegurarnos de que se mantenga integro en todo momento.
- El modelo de datos especifica los datos que se encuentran en cada celda de la tabla por lo que hay que alimentarlo correctamente.
Ahora tenemos un problema:
La tabla usa 2 modelos uno para las columnas y otro para los datos.
Las clases son: TableColumnModel y TableModel (bueno son interfaces) las clases concretas son: DefaultTableColumnModel y DefaultTableModel.
Tenemos que poner ambas en la tabla, una que diga que columnas queremos y otra que nos diga que valores queremos en la tabla.
Normalmente queremos las mismas columnas solo distintas filas por lo que vale la pena separar esta funcionalidad en un metodito que lo haga todo por nosotros.
La clase de la tabla debe quedar asi:
package net.edzero.tableDemo;
import javax.swing.JTable;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class CustomTable extends JTable {
private static final long serialVersionUID = 1L;
private DefaultTableModel model;
public CustomTable() {
TableColumn columnaNombre = new TableColumn();
TableColumn columnaEdad = new TableColumn();
TableColumn columnaCredito = new TableColumn();
columnaNombre.setHeaderValue("Nombre");
columnaEdad.setHeaderValue("Edad");
columnaCredito.setHeaderValue("Crédito");
columnaNombre.setModelIndex(0);
columnaEdad.setModelIndex(1);
columnaCredito.setModelIndex(2);
DefaultTableColumnModel columnas = new DefaultTableColumnModel();
columnas.addColumn(columnaNombre);
columnas.addColumn(columnaEdad);
columnas.addColumn(columnaCredito);
model = new DefaultTableModel();
model.addColumn(columnaNombre);
model.addColumn(columnaEdad);
model.addColumn(columnaCredito);
this.setModel(model);
this.setColumnModel(columnas);
// A partir de aqui es codigo para probar. lo vamos a quitar luego
addRow("Eduardo", 27, 9999);
addRow("Dora", 27, 8230);
addRow("Juan", 27, 7212);
addRow("Fernando", 27, 4224);
}
private void addRow(String nombre, Integer edad, Integer credito) {
model.addRow(new Object[] { nombre, edad, credito });
}
}
Sé que se ve mas fea. pero vamos un poco a las tripas de esta bestia (incomprendida)
Se ve complicada por que swing complico todo. primero vamos al metodo addRow del final que es el mas chiquito.
- Add Row usa el model por default de swing que ponemos en el constructor e invoca addRow en el con un parametro feo que es vilmente un arreglo de lo que debe de poner en cada celda de esa fila. primero el nombre y despues la edad y al final el credito.
Ahora si al constructor.
- Primero declaramos 3 columnas, ahi no debe haber mucha ciencia.
- Despues a las columnas les ponemos un headerValue que es lo que va a mostrar en el encabezado
- Despues el model index que es de donde vamos a sacar el dato a mostrar en esa columna, si no ponemos esto entonces nos va a mostrar SIEMPRE lo que este en la posicion 0,X
- Despues creamos el tableColumnModel y agregamos esas columnas al modelo.
- Despues creamos el tableModel y le agregamos las columnas tambien (esto es por que swing apesta, o al menos la implementación DEFAULT apesta)
- despues asignamos ambos a nuestra tabla.
- Finalmente unos datos de prueba que vamos a quitar cuando acabemos.
Es importante que ahora que pusimos el modelo NO LO CAMBIEMOS es decir no podemos volver a llamar setModel o setColumnModel por que esto destruiria lo poco que llevamos de la tabla.
Siguientes pasos:
Pues el codigo de las columnas puede ir a dar a una enumeración o cosas asi, aqui podemos ser creativos.
Download complete…