Hola a todos, hoy os voy a explicar como podemos pintar filas en un JTable en Java.
Si necesitamos pintar filas de nuestro JTable, Java no nos deja hacerlo directamente, tenemos que usar ciertos trucos.
El ejemplo que veremos, lo tenéis disponible para descargar al final del post.
Veamoslo con un ejemplo, nosotros tenemos esta ventana:
Queremos pintar las filas de la siguiente forma:
- Verde: cuando el stock sea mas o igual a 10.
- Amarillo: cuando el stock este entre 5 y 10.
- Rojo: cuando el stock es menor que 5.
Para hacer esto, necesitamos crearnos una clase aparte, en mi caso la voy a llamar MiRenderer y tenéis que hacer que herede de la clase DefaultTableCellRenderer:
import javax.swing.table.DefaultTableCellRenderer; public class MiRenderer extends DefaultTableCellRenderer { }
Tenemos que sobreescribir el método getTableCellRendererComponent:
import java.awt.Component; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; public class MiRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { } }
Esta función va a entrar por cada celda que tengas, no cada fila como tal.
Entonces lo que voy a hacer es coger el valor de la columna de la fila donde este y según ese valor.
Con setBackground coloreo la celda como quiero y setForeground es para la lo contrario del background, en nuestro caso las letras.
import java.awt.Color; import java.awt.Component; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; public class MiRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { int numero = (Integer) table.getValueAt(row, 1); if (numero >= 10) { setBackground(Color.GREEN); setForeground(Color.BLACK); } else if (numero >= 5 && numero < 10) { setBackground(Color.YELLOW); setForeground(Color.BLACK); } else { setBackground(Color.RED); setForeground(Color.BLACK); } return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } }
Nos falta lo mas importante y es asociar esta clase con la tabla. No vamos al form donde este la tabla y ponemos lo siguiente:
this.tblDatos.setDefaultRenderer(Object.class, new MiRenderer());
Si ejecutamos este será el resultado:
Os dejo un vídeo donde podéis verlo con mas detalle:
Aquí os dejo el ejemplo completo para que lo descarguéis y probéis.
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
Excelente ejemplo. Explicado de manera muy sencilla y fácil de entender, lo pude aplicar de manera muy fácil en mi proyecto. Gracias.