JTable: Cambiar los colores de las celdas

De ChuWiki

Vamos a ver una forma sencilla de cambiar los colores de las celdas en un JTable.

La opción más simple es hacer una clase que herede de DefaultTableCellRenderer y redefinir el método getTableCellRendererComponent().

DefaultTableCellRenderer hereda de JLabel y será este JLabel el que se presente en la celda del JTable. Por ello, cambiando el color de este JLabel (el this), y devolviéndolo en el método getTableCellRendererComponent(), tendremos cambiado el color de la celda del JTable.

El código de ejemplo podría ser así

package ....
import ....

public class MiRender extends DefaultTableCellRenderer
{
   public Component getTableCellRendererComponent(JTable table,
      Object value,
      boolean isSelected,
      boolean hasFocus,
      int row,
      int column)
   {
      super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
      if ( condicionParaCambiarElColor )
      {
         this.setOpaque(true);
         this.setBackground(Color.RED);
         this.setForeground(Color.YELLOW);
      } else {
         // Restaurar los valores por defecto
      }

      return this;
   }
}

La idea básica es llamar a super.getTableCellRendererComponent() para que nuestra clase padre se encargue de configurar el JLabel con los colores por defecto, ponerle borde, etc.

Luego, nosotros decidimos con algún criterio -de ahí el if- el color de background y de foreground que queremos. Hacemos que la etiqueta sea opaca -por defecto son transparentes, por lo que se suele ignorar el color de bakground-. Finalmente devolvemos la etiqueta -return this-

Si queremos hacerlo bien del todo, deberíamos hacer caso a los parámetros que nos pasan en este método. Cosas como isSelected deberían servirnos para poner la celda de distinto color en función de si está o no seleccionada, hasFocus para marcarla de alguna manera si es la celda que tiene el foco, etc.

Otra cosa a tener en cuenta es que siempre estamos reutilizando el mismo JLabel -DefaultTableCellRenderer hereda de JLabel y es esta misma clase la que estamos usando una y otra vez-. Por ello, de una llamada a otra recuerda el color que le dimos la vez anterior. Por ello, deberíamos siempre dar un color al JLabel, bien el de defecto, bien el que nosotros queramos dar.

Ahora sólo nos queda poner esto en el JTable. La forma de poner esto para todas las celdas es

 JTable tabla = new JTable (...);
 ...
 tabla.setDefaultRenderer (Object.class, new MiRender());

El primer parámetro indica a qué tipo de datos de la tabla afectaría nuestro Render. Poniendo Object.class afecta a todos. Podríamos poner cosas como Integer.class, Float.class, String.class, etc.


Enlaces[editar]