Coloreando las celdas, filas y columnas de una tabla JTable en Java

Estándar

Debido que una tabla de datos puede llegar a ser visualmente tediosa, dificil de seguir debido a su tamaño o que deseé resaltar ciertos valores significativos es posible que necesite colorear ciertas celdas, filas, columnas o cualquier combinación de estas en forma especifica, aqui presentaremos como.

TableCellRenderer
Cada objecto JTable cuenta con un objecto una clase que implemente la interfaz TableCellRenderer, mismo que se encarga de controlar como se renderiza cada celda que componga la JTable via el metodo getTableCellRendererComponent, como seguro ya dedujo, si deseamos controlar los colores de las celdas de la tabla necesitamos una clase que implemente la interfaz TableCellRederer y defina el método getTableCellRendererComponent para que haga lo que necesitamos, no se asuste por complejo que esto suene (y que algunos de esos metodos tienen una cantidad extrañamente larga de argumentos) esto es muy sencillo y lo veremos a continuación.

Implementando la interfaz TableCellRenderer.
Esta interfaz es muy sencilla, solo agrege implements TableCellRenderer despues del nombre de la clase y agrege el método getTableCellRendererComponent, como se ve en el código a continuación.

package colortable;

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author darta_000
 */
public class Resaltador implements TableCellRenderer {
    private Integer fila;
    public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();
    
    /**
     * Creamos el resaltador indicando que fila se coloreara por defecto
     * @param row 
     */
    public Resaltador(Integer row){
        fila = row;
    }
    
    /**
     * Colorea la celda si pertenece a la fila indicada, esta funcion es llamada internamente por la tabla
     * que use esta clase como renderizados
     * @param table Tabla
     * @param value Valor de la celda
     * @param isSelected Celda selecionada
     * @param hasFocus Celta tiene el foco
     * @param row Fila de la celda
     * @param column Columna de la celda
     * @return Celda de la tabla
     */    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        // Obtenemos la celda que se esta renderizando
        Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Si la celda esta en la fila indicada y no esta seleccionada se coloreara de este modo        
        if (fila.compareTo(row) == 0 && isSelected == false) {
            c.setBackground(Color.decode("#FF88FF"));
            c.setForeground(Color.BLACK);
        // Si la celda esta en la fila indicada y esta seleccionada se coloreara de este modo
        } else if (fila.compareTo(row) == 0 && isSelected == true) {
            c.setBackground(Color.RED);
            c.setForeground(Color.WHITE);
        // Si la celda no esta en la fila indicada y esta seleccionada se coloreara de este modo
        } else if (fila.compareTo(row) != 0 && isSelected == true) {
            c.setBackground(Color.BLUE);
            c.setForeground(Color.WHITE);
        // En los demas casos se coloreara de este modo
        } else {
            c.setBackground(Color.WHITE);
            c.setForeground(Color.BLACK);
        }
        // Regresamos la celda para que se agrege a la tabla
        return c;
    }

    /**
     * @return the fila
     */
    public Integer getFila() {
        return fila;
    }

    /**
     * @param fila the fila to set
     */
    public void setFila(Integer fila) {
        this.fila = fila;
    }
}

Notara que el método getTableCellRendererComponent tiene varios argumentos que hace cada uno se describe a continuación:

  • JTable table – La tabla sobre la que opera el metodo
  • Object value – El valor a presentar en esa celda
  • boolean isSelected – Le indicara si esa celda esta seleccionada
  • boolean hasFocus – Le indica si esa celda tiene el foco de edición
  • int row – Indica el numero de fila en que se encuentra la celda
  • int colum – Indica el numero de columna en que se encuntra la celda.

Antes que se pregunte donde va a sacar esos parametros recuerde que esa función es usada internamente por el JTable, esos argumentos estan ahi para que pueda identificar si una celda debe de ser rendereizada en forma especial, como vimos en la clase que creamos previamente

Ejemplo
Para este ejemplo haremos algo sencillo, crearemos una tabla, la cual llenaremos con datos, via una entrada de texto diremos que fila queremos colorear y con un boton refrescaremos la tabla

package colortable;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author darta_000
 */
public class ColorTable extends JFrame implements ActionListener {

    private final JTable tabla;
    private final JScrollPane barras;
    private final DefaultTableModel modelo;
    private final JTextField entrada;
    private final JButton boton;
    private final String[] columnas = {"Indice", "Dato"};
    Resaltador resaltado;

    /**
     * Crea la ventana con la tabla
     */
    public ColorTable() {
        entrada = new JTextField();
        boton = new JButton("Resaltar");
        modelo = new DefaultTableModel();
        tabla = new JTable();
        barras = new JScrollPane(tabla);
        resaltado = new Resaltador(0);

        // Detalles de la ventana
        this.setTitle("Tabla Color");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());

        // Establecemos el modelo de la tabla.
        modelo.setColumnIdentifiers(columnas);
        tabla.setModel(modelo);

        //Colocamos los elementos en su lugar
        this.getContentPane().add(barras, BorderLayout.CENTER);
        this.getContentPane().add(entrada, BorderLayout.NORTH);
        this.getContentPane().add(boton, BorderLayout.SOUTH);

        // El evento del boton
        boton.addActionListener(this);

        // Iniciamos el valor del texto
        entrada.setText("0");

        // Indicamos como sera el resaltado de la tabla
        tabla.setDefaultRenderer(Object.class , resaltado);

    }

    /**
     * Limpia y agrega los datos en la tabla
     */
    private void agregarDatos() {
        String[] datos = {"CERO", "Uno", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve", "Diez", "Once"};

        modelo.setRowCount(0);

        for (int i = 0; i < datos.length; i++) {
            Object[] row = {i, datos[i]};
            modelo.addRow(row);
        }
    }

    /**
     * Muestra la ventana en pantalla
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        ColorTable color = new ColorTable();

        color.pack();
        color.setVisible(true);
    }

    /**
     * Lo que se realiza cuando se presiona el boton
     * @param e Evento
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        Integer fila;
        try {
            fila = Integer.parseInt(entrada.getText());
        } catch (NumberFormatException ex) {
            fila = 0;
        }

        resaltado.setFila(fila);

        this.agregarDatos();
    }
}

Al momento de ejecutar el programa vera algo como en la figura 1.

01_inicio

Figura 1 – Programa recien iniciado.

Presione el boton resaltar y vera que la fila cero se colorea.

02_color_0

Figura 2 – Fila cero coloreada.

Escriba el numero de alguna fila en la entrada de texto, presione el boton y vera como esa fila se colorea, cambie el numero y vera otra fila cambiar.

03_nueve

Figura 3 – Cambiando la fila coloreada.

El coloreado puede ser cambiando dinamicamente, y esto se aplicara cada vez que se actualice la tabla.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s