Dúvidas com DefaultTableCellRenderer

1 resposta
marcusluiz83

Boa tarde!

Amigos, costumo criar meus tablemodels como no exemplo abaixo:

package tabelas;

import br.com.landa.modelos.Transferencia;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class TransferenciaTableModel extends AbstractTableModel {

    private List<Transferencia> linhas;
    private String[] colunas = new String[]{
        "Responsável", "Código", "Produto", "Data"};

    public TransferenciaTableModel() {
        linhas = new ArrayList<Transferencia>();
    }

    public TransferenciaTableModel(List<Transferencia> transferidos) {
        linhas = new ArrayList<Transferencia>(transferidos);
    }

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

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

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

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return String.class;
            case 1:
                return String.class;
            case 2:
                return String.class;
            case 3:
                return Date.class;
            default:
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Transferencia t = linhas.get(rowIndex);

        switch (columnIndex) {
            case 0:
                return t.getResponsavel();
            case 1:
                return t.getCodigo();
            case 2:
                return t.getProduto();
            case 3:
                return t.getData().getTime();
            default:
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    }

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

    public Transferencia getTransferencia(int indiceLinha) {
        return linhas.get(indiceLinha);
    }

    public void addTransferencia(Transferencia t) {
        linhas.add(t);

        int ultimoIndice = getRowCount() - 1;

        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

    public void removeTransferencia(int indiceLinha) {
        linhas.remove(indiceLinha);

        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }

    public void addListaDeTransferidos(List<Transferencia> t) {
        int tamanhoAntigo = getRowCount();

        linhas.addAll(t);

        fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
    }

    public void limpar() {
        linhas.clear();

        fireTableDataChanged();
    }

    public boolean isEmpty() {
        return linhas.isEmpty();
    }
}

No exemplo acima, na minha JTable, a data é exibida no formato “dd/MM/yyyy”. Depois de muito custo e pesquisas, consegui este renderer para colorir algumas linhas dadas determinadas condições:

package tabelas;

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

public class ColorCellRenderer extends DefaultTableCellRenderer  
{  
   private Color bg;  
   private Color fg;  
  
    public ColorCellRenderer(Color backGround, Color foreGround)  
    {  
        this.bg = backGround;  
        this.fg = foreGround;  
    }  
  
    @Override  
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)  
   {  
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);  
       
        if (table.getValueAt(row, 0).toString().equals("167")){  
            comp.setBackground(Color.RED);  
            comp.setForeground(Color.WHITE);  
        }else if (table.getValueAt(row, 0).toString().equals("058")){  
            comp.setBackground(Color.CYAN);  
            comp.setForeground(Color.MAGENTA);  
        }else{  
            comp.setBackground(table.getBackground());  
            comp.setForeground(table.getForeground());  
        }  
          
        if(isSelected)  
        {  
            comp.setBackground(table.getSelectionBackground());  
            comp.setForeground(table.getSelectionForeground());  
        }  
        return comp;  
   }  
  
}

Depois que criei este renderer, a data na JTable passou a ser exibida assim: “1327629600000”. Como faço para formatar a data no renderer?

Eu executo o renderer neste método:

public void pintaLinhas() {
        TableCellRenderer tcr = new ColorCellRenderer(Color.RED, Color.BLUE);

        for (int i = 0; i < tbSocios.getColumnCount(); i++) {
            tbSocios.getColumnModel().getColumn(i).setCellRenderer(tcr);
        }
    }

Espero que possam me ajudar. Tenho muita dificuldades com JTables.

Obrigado!

1 Resposta

marcusluiz83

Boa tarde!

Consegui resolver da seguinte forma na própria classe com o Renderer:

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if (column == 3) {
            DateFormat formatter = DateFormat.getDateInstance();
            setText(formatter.format(value));
        }
        if (table.getValueAt(row, 0).toString().equals("167")) {
            comp.setBackground(Color.RED);
            comp.setForeground(Color.WHITE);
        } else if (table.getValueAt(row, 0).toString().equals("058")) {
            comp.setBackground(Color.CYAN);
            comp.setForeground(Color.MAGENTA);
        } else {
            comp.setBackground(table.getBackground());
            comp.setForeground(table.getForeground());
        }

        if (isSelected) {
            comp.setBackground(table.getSelectionBackground());
            comp.setForeground(table.getSelectionForeground());
        }
        return comp;
    }
Criado 22 de abril de 2012
Ultima resposta 24 de abr. de 2012
Respostas 1
Participantes 1