Desenvolvi uma classe super mega util para o pessoal que pretende pintar linhas ou colunas de um JTable com determinados resultados (ou ate sem nenhuma regra em especifico:
A classe possui dois parâmetros de entrada, o primeiro é o id que vc pretende dar a tabela (ou seja, esta classe pinta diversas tabelas), e o segundo parâmetro armazena a coluna caso vc pretenda pintar um unico resultado entre a coluna e linha, segue o exemplo:
-
Sem regra para pintar coluna:
-
Com regra para pintar coluna:
package classes;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class ColorRender extends DefaultTableCellRenderer {
private final int codTabela; // tabela que sofrerá a ação
private final int columnAlter; // coluna que sofrerá as ações junto com as linhas (pintando uma unica célula)
public ColorRender(int codTabela, int columnAlter) {
this.codTabela = codTabela;
this.columnAlter = columnAlter;
}
@Override
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (isSelected) {
// define cor e fonte caso a linha esteja selecionada
setBackground(table.getSelectionBackground());
setForeground(Color.WHITE);
} else {// caso não esteja selecionado...
setForeground(Color.BLACK); // Volta para cor fonte default
// define cor zebrada da tabela
if (row % 2 == 0) { // pinta a linha de branco quando a linha for par
setBackground(Color.WHITE);
} else { // pinta a linha de cinza quando for impar
setBackground(new Color(235, 235, 235));
}
// Abaixo possui as regras, poderá ser adicionado varias regras diferentes para varias tabelas,
try {
if (codTabela == 1 || codTabela == 2) { //Regra da Tabela 1 e 2 , ambas pintam colunas
if (table.getValueAt(row, columnAlter).equals("Aberto")) { // Sempre que a coluna X possuir "Aberto", pinte:
if (column == columnAlter) { // Mais um regra: quero que pinte apenas a coluna selecionada pelo columnAlter
setFont(new java.awt.Font("Tahoma", 1, 12)); //fonte
setForeground(new java.awt.Color(102, 0, 0)); //cor da fonte
} else { // cor dos valores que não estão na coluna X, porém deram resultados verdadeiro
setForeground(Color.black);
}
}
}
if (codTabela == 3) { // Regra da tabela 3, ela não possui filtro de coluna, ou seja, irá pintar a linha inteira
if (!table.getValueAt(row, 5).equals("")) { // Sempre que a coluna X não possuir valor, pinte:
setFont(new java.awt.Font("Tahoma", 1, 12));
setForeground(new Color(0, 153, 0));
}
}
} catch (java.lang.NullPointerException ex) {
}
}
return this;
}
}
Para chamar a classe faça o seguinte la no método construtor da sua janela:
jTable1.setDefaultRenderer(Object.class,new ColorRender(3,0));
Espero ter ajudado, duvidas pode perguntar