GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Classe pronta para pintar JTable

java
desenvolvimento
programação
classe
Tags: #<Tag:0x00007f310f865e10> #<Tag:0x00007f310f865cd0> #<Tag:0x00007f310f865b90> #<Tag:0x00007f310f865a50>

#1

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


Colorir Jtable
Mudar a cor da linha de um JTable
Como trocar a cor de uma determinada coluna do jtable?
Selecionar linha na JTable
#2

Boa tarde,

 infelizmente não deu certo pro que preciso.

mas obrigado pela postagem.


#3

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


#4

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.