Pintar Determinadas linhas JTable

6 respostas
J

Boa Tarde!

Estou com um problema a muito tempo, vasculhei por todo o Fórum e nada que achei resolve meu problema.
Meu problema é o seguinte, preciso colorir um JTable com 5 cores diferentes, dependendo do conteúdo de uma determinada Célula.
Até tudo bem, consigo colorir, porém apenas as colunas setadas como String. Colunas Integer, Date, Double ou algum outro tipo de dado não são pintados.
Já não sei mais oque fazer!/

Alguém aí pode me dar uma Luz?

Desde já agradeço.

att.
Julio Cezar Rutke

6 Respostas

A

cara,

ve te ajuda, http://www.exampledepot.com/egs/javax.swing.table/Stripe.html

t+

J

Cara eu consigo colorir e tal dessa forma, porém só consigo fazer em modo zebrado.
O que eu preciso e colorir algumas linhas específicas.
Por exemplo tem uma coluna com tipo de lançamento. Nessa coluna posso ter os seguintes valores: Recebimento, Pagamento, Saque e Depósito.
dependendo do tipo de lançamento a linha leva determinada cor de fundo!

Entende?

M

como observei que existem muitas dúvidas em trabalhar com table, fiz um exemplo completo
neste exemplo utilizei um TableModel proprio, um TableRenderer (para a mudança de cor e coisas mais) e DefaultCellEditor
todos os campos sao editáveis, e mudando a profissao havera tb a mudanca de cor da linha
segue o codigo

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableModel;

/**
 *
 * @author marlon
 */
public class Tabela extends JFrame {

    private JScrollPane scroll;
    private JTable tabela;
    private List<TabelaData> listaTabelaDatas;

    public Tabela() {
        init();
    }

    final void init() {

        listaTabelaDatas = new LinkedList<TabelaData>();
        listaTabelaDatas.add(new TabelaData("Profissional 1", 30, "Contador", 3000.2));
        listaTabelaDatas.add(new TabelaData("Profissional 2", 26, "Programador", 3000.50));
        listaTabelaDatas.add(new TabelaData("Profissional 3", 30, "Contador", 2800.0));
        listaTabelaDatas.add(new TabelaData("Profissional 4", 30, "Estagiario", 500.75));
        listaTabelaDatas.add(new TabelaData("Profissional 5", 30, "Programador", 3800.0));
        listaTabelaDatas.add(new TabelaData("Profissional 6", 30, "Gerente", 3000.0));
        listaTabelaDatas.add(new TabelaData("Profissional 7", 30, "Contador", 2000.0));

        this.setTitle("Teste tabela");
        this.setLayout(new BorderLayout());

        tabela = new JTable(new TabelaModel(listaTabelaDatas));
        tabela.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(new JComboBox(new String[]{"Contador","Programador","Estagiario","Gerente"})));
        tabela.setDefaultRenderer(String.class, new TabelaRender());
        tabela.setDefaultRenderer(Double.class, new TabelaRender());
        tabela.setDefaultRenderer(Integer.class, new TabelaRender());

        scroll = new JScrollPane(tabela);

        this.add(scroll, BorderLayout.CENTER);

        this.pack();
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    public static void main(String args[]) {
        new Tabela();
    }
}

/**
 * Objeto que sera identificado na tabela
 * @author marlon
 */
class TabelaData {

    private String nome;
    private Integer idade;
    private String profissao;
    private Double salario;

    public TabelaData() {
    }

    public TabelaData(String nome, Integer idade, String profissao, Double salario) {
        this.nome = nome;
        this.idade = idade;
        this.profissao = profissao;
        this.salario = salario;
    }

    public Integer getIdade() {
        return idade;
    }

    public void setIdade(Integer idade) {
        this.idade = idade;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getProfissao() {
        return profissao;
    }

    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    public Double getSalario() {
        return salario;
    }

    public void setSalario(Double salario) {
        this.salario = salario;
    }
}

/**
 * Modelo da tabela
 * @author marlon
 */
class TabelaModel extends AbstractTableModel implements TableModel {

    private List<TabelaData> listaTabelaData;
    final String[] colunas = new String[]{"Nome", "Idade", "Profissao", "Salario"};

    public TabelaModel() {
        listaTabelaData = new LinkedList<TabelaData>();
    }

    public TabelaModel(List<TabelaData> listaTabelaData) {
        this.listaTabelaData = listaTabelaData;
    }

    @Override
    public int getRowCount() {
        return listaTabelaData.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        TabelaData tb = listaTabelaData.get(rowIndex);
        switch (columnIndex) {
            case 0:
                return tb.getNome();
            case 1:
                return tb.getIdade();
            case 2:
                return tb.getProfissao();
            case 3:
                return tb.getSalario();
            default:
                return null;
        }
    }

    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return String.class;
            case 1:
                return Integer.class;
            case 2:
                return String.class;
            case 3:
                return Double.class;
            default:
                return null;
        }
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        TabelaData td = listaTabelaData.get(rowIndex);
        switch (columnIndex) {
            case 0:
                td.setNome(aValue.toString());
                break;
            case 1:
                td.setIdade(new Integer(aValue.toString()));
                break;
            case 2:
                td.setProfissao(aValue.toString());
                break;
            case 3:
                td.setSalario(new Double(aValue.toString()));
                break;
        }
        listaTabelaData.set(rowIndex, td);
        fireTableRowsUpdated(rowIndex, rowIndex);
    }

    public TabelaData getTabelaData(int rowIndex) {
        return listaTabelaData.get(rowIndex);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }
}

/**
 * Classe responsavel pela representacao da tabela
 * A mudança de cor está aqui
 * @author marlon
 */
class TabelaRender extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        TabelaData t = ((TabelaModel) table.getModel()).getTabelaData(row);

        JLabel c = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setOpaque(true);
        //inicia diferença de cor
        if (!isSelected) {
            //se a linha nao for selecionada, muda a cor de fundo de acordo com a profissao e muda a cor da fonte para preto
            c.setForeground(table.getForeground());
            if (t.getProfissao().equals("Contador")) {
                c.setBackground(Color.lightGray);
            } else if (t.getProfissao().equals("Programador")) {
                c.setBackground(Color.cyan);
            } else if (t.getProfissao().equals("Gerente")) {
                c.setBackground(Color.YELLOW);
            } else {
                c.setBackground(Color.white);
            }
        } else {
            //caso contrario, muda a cor de fundo para cinza escuro e a fonte para a cor correspondente a profissao
            c.setBackground(Color.darkGray);
            if (t.getProfissao().equals("Contador")) {
                c.setForeground(Color.lightGray);
            } else if (t.getProfissao().equals("Programador")) {
                c.setForeground(Color.cyan);
            } else if (t.getProfissao().equals("Gerente")) {
                c.setForeground(Color.YELLOW);
            } else {
                c.setForeground(Color.white);
            }
        }
        //fim da diferenca de cor

        //formata as celulas com valor numerico
        if (value instanceof Double) {
            c.setHorizontalAlignment(JLabel.RIGHT);
            c.setText("R$" + new DecimalFormat("###,##0.00").format(t.getSalario()));
        } else if (value instanceof Integer) {
            c.setHorizontalAlignment(JLabel.RIGHT);
        }
        return c;
    }
}

espero q esse exemplo seja útil a todos
ATT

J

O modelo que passou funciona perfeitamente, porém não se encaixa com a forma que eu populo a minha JTable.
Eu utilizei a sua lógica para pintar as linhas e funciona porém não como deve. Mas isso é algum problema de código, algo que acabei esquecendo.

Agradeço a ajudo de todos!

Se alguém ainda tiver alguma sugestão pode postar, será bem vinda!

M

posta o codigo

J

Código do Renderizador

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

/**
 *
 * @author Julio Cezar
 */
public class MeuRenderer implements TableCellRenderer {

    public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();
    boolean tabela;

    public MeuRenderer(boolean tabela) {
        this.tabela = tabela;
        
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

        Component renderer = DEFAULT_RENDERER.getTableCellRendererComponent(
                table, value, isSelected, hasFocus, row, column);

        Color foreground, background;

        if(isSelected){
            foreground = Color.WHITE;
            background = new Color(113, 113, 255);            
        }else{
            Object ref = table.getValueAt(row, 8);
            if(ref != null && ref == "Pagamentos"){
                foreground = Color.BLACK;
                background = new Color(255, 204, 255);
            }else if(ref != null && ref == "Recebimentos"){
                foreground = Color.BLACK;
                background = new Color(204, 204, 255);
            }else if(ref != null && ref == "Saques"){
                foreground = Color.BLACK;
                background = new Color(204, 255, 204);
            }else if(ref != null && ref == "Depósitos"){
                foreground = Color.BLACK;
                background = new Color(153, 204, 255);
            }else{
                foreground = Color.white;
                background = Color.DARK_GRAY;
            }
        }

        renderer.setForeground(foreground);
        renderer.setBackground(background);
        return renderer;

    }
}
Código que monta a tabela
try{
            ResultSet rs = new LancamentosDAO().carregar(dados());
            tabela.setModel(new ModeloGrade(rs, new String[]{"Código","Data",
                "Nome","Categoria","Débito","Crédito","Campo","Tipo","Valor"}));
            tabela.getColumnModel().getColumn(0).setMaxWidth(50);
            tabela.getColumnModel().getColumn(1).setMaxWidth(150);
            tabela.getColumnModel().getColumn(4).setMaxWidth(50);
            tabela.getColumnModel().getColumn(5).setMaxWidth(50);
            TableCellRenderer renderer = new MeuRenderer(true);
            tabela.setDefaultRenderer(String.class, renderer);
            tabela.setDefaultRenderer(Integer.class, renderer);
            tabela.setDefaultRenderer(BigDecimal.class, renderer);
            tabela.setDefaultRenderer(Date.class, renderer);
//            addCor();
        }catch(Exception ex){
            showMessageDialog(this,"Erro ao carregar dados!\n"+ ex.getMessage(), "ERRO", ERROR_MESSAGE);
            ex.printStackTrace();
        }

Método Carregar, monta Resultset

public ResultSet carregar(PLancamento pl) throws Exception {
    Statement stm = cc.getConexao().createStatement();
    String sql = "SELECT * from lancamentos";
//   sql simbólica por questão de segurança
    return stm.executeQuery(sql);
  }
Criado 10 de novembro de 2011
Ultima resposta 14 de nov. de 2011
Respostas 6
Participantes 3