Formatar data pelo getTableCellRendererComponent

2 respostas
javajtable
C

Pessoal, estou com um jtable e nele tem uma coluna que é data, tenho que formatar padrão Brasileiro e estou tentando através do getTableCellRendererComponent mas não está funcionando tentei usando a variável como LocalDate e como Date mas sem sucesso, podem me ajudar no que estou fazendo de errado?

nos códigos abaixo deixei com Date enfim estou aberto a sugestões.

Minha Classe Renderer

package Util;


import java.awt.Component; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer;

public class MeuRenderer extends DefaultTableCellRenderer {

    SimpleDateFormat formatador = new SimpleDateFormat("dd-MM-yyyy");

    @Override
    public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column);

        //efeito zebra na tabela
        if (isSelected) {
            this.setBackground(new java.awt.Color(70, 130, 180));
        } else {
            if (row % 2 == 0) {
                this.setBackground(new java.awt.Color(211, 219, 255));
            } else {
                this.setBackground(new java.awt.Color(255, 255, 255));
            }
        }

        //formatar data 
        if (obj instanceof Date) {
            this.setText(formatador.format((Date) obj));
        }

        return this;

    } }

Método carregando a Lista

public List<Membro> selectAll(Membro obj) throws SQLException {
        List lista = new ArrayList();
        String select = "select "
                + "p.pes_id, "
                + "p.pes_nome, "
                + "p.pes_dtinclusao, "
                + "m.mem_codigo, "
                + "m.pes_id, "
                + "m.mem_num,"
                + "m.con_id,"
                + "c.con_id,"
                + "c.con_descricao "
                
                + "FROM pessoa AS p "
                + "JOIN membro AS m "
                + "JOIN congregacao AS c "
                + "ON p.pes_id = m.pes_id "
                + "AND m.con_id = c.con_id "
                + "ORDER by m.mem_num";
        try (PreparedStatement stmt = getConnection().prepareStatement(select);
                ResultSet rs = stmt.executeQuery()) {
            while (rs.next()) {
                obj = new Membro();
                obj.setPes_id(rs.getInt("p.pes_id"));
                obj.setPes_nome(rs.getString("p.pes_nome"));
                obj.setPes_dtinclusao(rs.getDate("p.pes_dtinclusao"));
                obj.setMem_codigo(rs.getInt("m.mem_codigo"));
                obj.setmIdPessoa(rs.getInt("m.pes_id"));
                obj.setMem_numeroFicha(rs.getInt("m.mem_num"));
                obj.setCon_codigo(rs.getInt("m.con_id"));
                
                obj.setCon_descricao(rs.getString("c.con_descricao"));

                lista.add(obj);
            }
        }
        return lista;
    }

Meu configura tabela

public void configuraTabela() {
        view.getTabela().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        ListSelectionModel lsm = view.getTabela().getSelectionModel();
        lsm.addListSelectionListener((ListSelectionEvent e) -> {
            if (!e.getValueIsAdjusting()) {
                selecionarLinha(view.getTabela());
            }
        });
        
        javax.swing.table.TableCellRenderer renderer = new MeuRenderer();
        view.getTabela().setDefaultRenderer(Object.class, renderer);
    
        sorter = new TableRowSorter<>(modelTable);
        view.getTabela().setRowSorter(sorter);
        view.getTabela().setModel(modelTable);
        view.getTabela().getTableHeader().setReorderingAllowed(false);
        view.getTabela().getColumnModel().getColumn(0).setMinWidth(0);
        view.getTabela().getColumnModel().getColumn(0).setMaxWidth(0);
        view.getTabela().getColumnModel().getColumn(5).setMinWidth(0);
        view.getTabela().getColumnModel().getColumn(5).setMaxWidth(0);
    }

Modeltablel

package Model.Table;

import Model.Membro;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class ModelTableMembro extends AbstractTableModel {

    List<Membro> lista;

    private final int COLUMN_CODIGO = 0;
    private final int COLUMN_NOME = 1;
    private final int COLUMN_NUMFICHA = 2;
    private final int COLUMN_CONGREGACAO = 3;
    private final int COLUMN_DTINCLUSAO = 4;
    private final int COLUMN_IDPESSOA = 5;
    private Date date;

    public ModelTableMembro(List<Membro> l) {
        lista = new ArrayList<>(l);
    }

    public ModelTableMembro() {
        this(new ArrayList<Membro>());
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return false;
    }

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

    @Override
    public int getColumnCount() {
        return 6;
    }

    @Override
    public String getColumnName(int columIndex) {
        if (columIndex == this.COLUMN_CODIGO) {
            return "codigoMembro";
        }
        if (columIndex == this.COLUMN_NOME) {
            return "Nome";
        }
        if (columIndex == this.COLUMN_NUMFICHA) {
            return "Numero Ficha";
        }
        if (columIndex == this.COLUMN_CONGREGACAO) {
            return "Congregação";
        }
        if (columIndex == this.COLUMN_DTINCLUSAO) {
            return "Membro Desde:";
        }
        return "codigoPessoa";
    }

    public void addRow(Membro c) {
        lista.add(c);
        Collections.sort(this.lista);
        this.fireTableDataChanged();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Membro c = this.lista.get(rowIndex);

        if (this.COLUMN_CODIGO == columnIndex) {//0
            return c.getMem_codigo();
        }
        if (this.COLUMN_NOME == columnIndex) {//1
            return c.getPes_nome();
        }
        if (this.COLUMN_NUMFICHA == columnIndex) {//2
            return c.getMem_numeroFicha();
        }
        if (this.COLUMN_CONGREGACAO == columnIndex) {//3
            return c.getCon_descricao();
        }
        if (this.COLUMN_DTINCLUSAO == columnIndex) {//4
            return c.getPes_dtinclusao();
        }
        return c.getPes_id();//5
    }

    @Override
    public void setValueAt(Object obj, int linha, int coluna) {
        Membro c = lista.get(linha);

        switch (coluna) {
            case 0:
                c.setMem_codigo((int)obj);
                break;
            case 1:
                c.setPes_nome((String)obj);
                break;
            case 2:
                c.setMem_numeroFicha((int)obj);
                break;
            case 3:
                c.setCon_descricao((String)obj);
                break;
            case 4:                        
                c.setPes_dtinclusao((Date)obj);
                break;
            case 5:
                c.setPes_id((int)obj);
                break;
        }
        this.fireTableCellUpdated(linha, coluna);
    }

    public void removeRow(int linha) {
        this.lista.remove(linha);
        this.fireTableRowsDeleted(linha, linha);
    }
}

2 Respostas

R

cria essa class

class FomatarDataRenderer extends DefaultTableCellRenderer {

        private final JLabel campoData = new JLabel();
        private Object data;

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            try {
                data= table.getValueAt(row, suaColuna);
                campoData.setText("data formatada");
            } catch (Exception e) {
            }
            return campoData;
        }
    }

E na hora q vc chama o model, vc faz:

view.getTabela().getColumnModel().getColumn(suaColuna).setCellRenderer(new SuaClasse.FomatarDataRenderer());

e mostra como vai ficar.

C

@rodriguesabner primeiramente obrigado pela ajuda!

eu não estou conseguindo executar a classe tenho algumas dúvidas, veja:

1º ali no getColumn(suaColuna) estou passando a coluna 4 que se refere a data ok?.

2º (new SuaClasse…) seria a classe Membro? pq ela não esta aceitando, apenas aceita eu colocar o pacote onde o FormatarDataRenderer está, ficando assim:
view.getTabela().getColumnModel().getColumn(4).setCellRenderer(new Util.FomatarDataRenderer());

3º eu chamo a classe FormatarDataRenderer no meu configuraTabela certo?

public void configuraTabela() {
        view.getTabela().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        ListSelectionModel lsm = view.getTabela().getSelectionModel();
        lsm.addListSelectionListener((ListSelectionEvent e) -> {
            if (!e.getValueIsAdjusting()) {
                selecionarLinha(view.getTabela());
            }
        });

        view.getTabela().getColumnModel().getColumn(4).setCellRenderer(new Util.FomatarDataRenderer());
    
        sorter = new TableRowSorter<>(modelTable);
        view.getTabela().setRowSorter(sorter);
        view.getTabela().setModel(modelTable);
        view.getTabela().getTableHeader().setReorderingAllowed(false);
    }
<strong>o erro que esta dando é este:</strong>

Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 4 >= 0

at java.util.Vector.elementAt(Vector.java:474)

at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)

at Controller.Helper.PesquisaMembroHelper.configuraTabela(PesquisaMembroHelper.java:150)

a classe que criei ficou assim está correto?
package Util;

import java.awt.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class FomatarDataRenderer extends DefaultTableCellRenderer {

    SimpleDateFormat formatador = new SimpleDateFormat("dd-MM-yyyy");
    private final JLabel campoData = new JLabel();
    private Object data;

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        try {
            data = table.getValueAt(row, column);
            campoData.setText(formatador.format((Date) data));
        } catch (Exception e) {
        }
        return campoData;
    }
}
Criado 9 de abril de 2020
Ultima resposta 10 de abr. de 2020
Respostas 2
Participantes 2