Normalmente un JTable en Java viene con un aspecto previamente definido, desde el formato de los textos y números, el color de fondo de las celdas, la alineación del texto, etc. Sin embargo, existen ocasiones en que es necesario cambiar dicho formato, por ejemplo, cambiar el color de fondo de las celdas, filas, columnas, el tipo, color y estilo de las letras, la alineación, etc. Incluso en ocasiones dicho formato es condicional, es decir, solo aplica cuando alguno(s) de los datos cumplen ciertos requisitos.
En esta ocasión dedicaré este artículo a explicar paso a paso cómo cambiar el formato de las celdas en una tabla, para ello, vamos a necesitar de una clase que implemente la interface TableCellRenderer.
::La interface TableCellRenderer::
TableCellRenderer es una interface que provee del comportamiento a cada una de las celdas en un JTable, a través de ella, podemos definir los colores, formatos, alineaciones y demás cuestiones visuales de la tabla, al implementar dicha interfaz solamente es necesario definir el comportamiento del método getTableCellRendererComponent() y dentro de él definir lo que se desea.
El dicho método tiene la siguiente estructura:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {Donde:
table: Es la tabla contenedora de la celda actual.
Object: El contenido de la celda.
isSelected: Indica si dicha celda está seleccionada o no.
hasFocus: Indica si dicha celda tiene o no el foco.
row: La fila en la que se encuentra ubicada la celda.
column: La columna en la que se encuentra ubicada la celda.
Ya que conocemos el método que se va a utilizar pasemos con la definición de la clase.
::Definición de la clase::
La clase que utilizaremos debe de heredar de cualquier tipo de objeto derivado de la clase Component, desde un campo de texto (JTextField) hasta incluso un panel (JPanel) que a su vez podrá contener cualquier otro componente. En este caso utilizaré el componente JFormattedTextField ya que en mi caso necesito darle cierto formato a los datos que manejarán cantidades monetarias.
La definición inicial de la clase queda de la siguiente manera:
public class FormatoTabla extends JFormattedTextField implements TableCellRenderer{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column) {
}
}Ahora bien, lo siguiente que debemos hacer es definir un objeto del tipo de la clase que vamos a estar manejando, en este caso un JFormattedTextField para irle dando el formato que deseamos. En este ejemplo lo definí dentro del método aunque puedes hacerlo como te sea más útil en tu aplicación…
JFormattedTextField campoTexto = new JFormattedTextField();
…posteriormente le establecí un borde vacío para que siguiera adaptándose al estilo de la tabla como normalmente la vemos…
campoTexto.setBorder(BorderFactory.createEmptyBorder());
…una vez hecho esto, vamos a aplicar el formato a la celda de acuerdo al tipo de dato que esta contenga, en mi caso la celda puede contener uno de 3 tipos: String, Integer o BigDecimal, que son los cuales voy a estar validando de la siguiente manera:
if (value instanceof String){
campoTexto.setText((String)value);}
if(value instanceof Integer){
campoTexto.setText(""+(Integer)value);
campoTexto.setHorizontalAlignment(SwingConstants.CENTER);}
campoTexto.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#,##0.00"))));
campoTexto.setHorizontalAlignment(SwingConstants.TRAILING);
campoTexto.setValue(valor);…pero si además su valor es negativo, le quito el signo menos (-) y le establezco su color de fondo a rojo…
if(valor.compareTo(new BigDecimal(0))==-1) {
campoTexto.setText(etiqueta.getText().replace("-", ""));
campoTexto.setBackground(new Color(0xFE899B));
campoTexto.setOpaque(true);
}…al hacer lo anterior solo la celda que contiene el valor negativo se dibujará de color rojo, sin embargo, en mi caso deseo que todas las celdas de dicha fila sean rojas así que agregué el siguiente código:
if(((BigDecimal)table.getValueAt(row, table.getColumnCount()-1)).compareTo(new BigDecimal(0))==-1){
campoTexto.setBackground(0xFE899B);
campoTexto.setOpaque(true);
}Lo que hago en las líneas anteriores es verificar si en la última celda del lado derecho de la fila en la que se encuentra la celda actual se localiza un valor negativo, en caso de ser así cambio el color de fondo de la celda actual a rojo claro.
Para terminar vamos a definir el comportamiento de las celdas al estar seleccionadas, en este caso, vamos a cambiar su color de fondo por un tono gris claro…
if(isSelected){
etiqueta.setBackground(Color.lightGray);
}Cuando desees utilizar el formato que hemos definido anteriormente en alguna de las tablas de tu aplicación basta con realizar lo siguiente:
FormatoTabla formato = new FormatoTabla(); tabla.setDefaultRenderer(BigDecimal.class, formato); tabla.setDefaultRenderer(String.class, formato); tabla.setDefaultRenderer(Integer.class, formato);
Con lo anterior estoy indicando que para la tabla ‘tabla’ se utilice el formato definido en la clase FormatoTabla para cada celda donde su valor sea de tipo BigDecimal, String e Integer.
Si lo deseas puedes descargar el código fuente de la clase FormatoTabla desde este vínculo.
Saludox.
Artículo original en Monillo007's Blog.
Soy un Ingeniero en Computacíón egresado de la Universidad de León en el año 2007. Actualmente trabajo como desarrollador de sistemas web para una dependencia gubernamental. De igual manera he formado una empresa que ofrece soluciones integrales en tecnologías de negocio de nombre Make It Bit.
© Copyright 2008-2009 debug_mode=ON | Aviso legal | Contacto | FAQ | ¿Quiénes somos? |