Classe pronta para pintar JTable

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:

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

Boa tarde,

 infelizmente não deu certo pro que preciso.

mas obrigado pela postagem.

Ta ficando assim, só queria que os dados ficasse em outra cor caso o status esteja em vermelho

Boa noite,

Depois de muitos estudos acabei fazendo de uma forma mais simples. Segue abaixo minha solução:
Criei uma classe RendererCustom para centralizar as colunas e mudar a cor também da coluna:

public class RendererCustom{

       DefaultTableCellRenderer cellRender = new DefaultTableCellRenderer();
// Alinhamento da coluna
       public DefaultTableCellRenderer getAlinhamentoColumn(String tipo){
    
            cellRender.setHorizontalAlignment(getAlinhamentoColum(tipo));
    
                return cellRender;
       }

      private int getAlinhamentoColum(String alinhamento){
    
                switch(alinhamento){
                    case "centro": return SwingConstants.CENTER;
                    case "direita": return SwingConstants.RIGHT;
                    default: return SwingConstants.LEFT;
               }
    
      }

 // Mudar a cor da coluna
      public DefaultTableCellRenderer getCor(){
    
           cellRender.setForeground(Color.red);
    
           return cellRender;
      }
    
}

Chamando o método de alinhamento:

 JTable.getColumnModel().getColumn(nº da coluna).setCellRenderer(
            new RendererCustom().getAlinhamentoColumn("centro")
        );

Chamando o método de mudar a cor:

if(se a condição que vc queria for verdade)){
        for(int i=0; i<JTable.getColumnCount(); i++){
            tbClientes.getColumnModel().getColumn(i).
                  setCellRenderer(new RendererCustom().getCor());
        }
    }

entra no laço para percorre toda a coluna mudando a cor.

Fazendo isso fica mais facil de mudar a cor, dependendo de como vocês forem colocar a chamada dos dados (um laço) é só colocar dentro dele para cada linha ser mudado a cor.

1 curtida