sábado, 5 de mayo de 2012

Cambiar color de las filas de una tabal (Jtable) en Java

En esta entrada os voy a comentar como hacer para cambiar los colores de las filas de un JTable en función de un valor o del valor de varios argumentos o celdas que vosotros queráis. Es algo realmente sencillo, ya veréis que con tan solo apenas 20 líneas de código se puede hacer... En este caso vamos a hacer que la tabla tenga las filas azules cuando el usuario este ACTIVO y que la fila esté roja cuando el usuario esté INACTIVO.

Me salto el paso de cómo crear la tabla ya que sino me va a quedar un código bastante amplio. Si alguien necesita que le diga como hacer una Tabla, ya sea con datos desde un archivo, desde BD, nada más que tiene que preguntarmelo.

Vamos allá.

Con la tabla montada, tenemos que hacer lo siguiente:

TablaClientes.setDefaultRenderer(Object.class, new FormatoTablaClientes());


Con esto estamos asignando un nuevo render a nuestra tabla. Para ello nos creamos una nueva clase FormatoTablaClientes que herede (extends) de DefaultTableCellRenderer.

El contenido de esta clase que hereda de DefaultTableCellRenderer es el siguiente:




import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class FormatoTablaUsuarios extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent
(JTable table, Object value, boolean selected, boolean focused, int row, int column)
{
        // SI EN CADA FILA DE LA TABLA LA CELDA 5 ES IGUAL A ACTIVO COLOR AZUL
if(String.valueOf(table.getValueAt(row,5)).equals("ACTIVO"))  setForeground(Color.blue);
                // SI NO ES ACTIVO ENTONCES COLOR ROJO
else  setForeground(Color.red);

super.getTableCellRendererComponent(table, value, selected, focused, row, column);
return this;
}
}




Si queremos que sea solamente el color de una celda, pues en este caso, solamente la celda de ACTIVO o INACTIVO deberíamos poner:   if(String.valueOf(table.getValueAt(row,column)).equals("ACTIVO"))

Podemos jugar con lo siguiente:

isSelected -> Si se selecciona la fila, columna, celda, etc... cambiar de color.
focused -> Si se ha hecho el foco sobre algo cambiar el color.

Y todo lo que se os ocurra.

Espero que os haya servido de ayuda y si tenéis cualquier duda sólo tenéis que preguntar :)

Un saludo.

10 comentarios:

  1. buenas tardes amigo tengo un caso en particular, me gustaria pintar las celdas que coincidan con el value de un color y las que no de otro color, siempre y cuando la fila este seleccionada.... espero me pueda colaborar

    ResponderEliminar
  2. Buenas tardes, no me llegó un aviso de que tenía un comentario pendiente.

    Sé que es muy tarde, pero bueno, por lo menos quería disculparme y si sigues necesitando algo, aquí andamos.

    Un saludo,

    ResponderEliminar
  3. pregunta, en la tabla donde implemente tu codigo tengo 8 columnas solo me pinta 3, lo curioso es que me pinta la 1,2 y 3 y deja las columnas 0,4,5,6 y 7 sin pintar.

    agradeseria tu apollo.


    jonnysoft.fiend@gmail.com
    jonnysoft@msn.com

    ResponderEliminar
    Respuestas
    1. Me paso lo mismo, seguramente estas utilizando otro render para la misma tabla. En mi caso, usaba que en determinadas columnas me centre el contenido, entonces cuando usaba el render para pintar las filas me pintaba solamente las que no usaba el render ese, descomente el codigo ese y lo probe y anduvo bien

      Eliminar
  4. Gracias despues de pasar toda una tarde usando los demas codigos que existen en internet, y tratar de crear mi codigo personalizado, y mucho dolor de cabeza me encontre con tu codigo y la verdad me ayudo, porque no se me habia ocurrido usar la tabla para determinar la forma en la que iba a pintar mis celdas. Ya que los demas codigos si funcionan pero solo a la primera ya si presionas click o arrastras todas tus celdas cambian de color debido a que el DefaultTableCellRenderer se vuelve a pintar afectando todas las filas!! Y eso fue un dolor de cabeza pero gracias por compartir tu codigo me fue de gran ayuda realmente!!

    ResponderEliminar
  5. Excelente, explicación corta sencilla y funcional, me funciono perfecto, gracias!

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  7. Muchas gracias, me ayudo bastante.

    ResponderEliminar
  8. A mi me pintaba toda la tabla a pesar del if column == 4 tuve que poner el else y quedo

    public class MyRender extends DefaultTableCellRenderer {

    public Component getTableCellRendererComponent(JTable table,Object value, boolean isSelected,boolean hasFocus,int row, int column){
    Component c = super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);


    DecimalFormat numberFormat = new DecimalFormat("#,##0.00");

    if (column == 4)
    {
    ((JLabel) c).setText(numberFormat.format(value));
    c.setBackground(new Color(255,250,205));
    c.setForeground(Color.BLACK);

    }
    else{
    c.setBackground(new Color(255,255,255));
    c.setForeground(Color.BLACK);
    }
    return c;
    }

    }

    ResponderEliminar