Criando CellRenderer para formatação de colunas na JTable

Olá programadores!

Há momentos que precisamos exibir os dados formatados na JTable, por exemplo para valor monetário, percentual, decimal com 3 casas decimais (ideal para medidas pesadas KG), data, hora dentre outros.

Vamos direito ao código, nele há comentários onde se torna autoexplicativo, este exemplo é composto por 2 classes de controle e uma classe visual, mostrarei somente alguns trechos da classe visual, onde é setado a configuração da JTable.

Para seguir com este tutorial é necessário conhecimento no post anterior sobre criação de jtable e/ou table model.

import java.text.Format;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * @author  Roberto Silva 
 * @brief 	classe é responsável pela formatação de data, hora
 */
public class FormatRenderer extends DefaultTableCellRenderer {

    private Format formatter;

    /*
     * No construtor da classe é passado o formato
     */
    public FormatRenderer(Format formatter) {
        this.formatter = formatter;
    }

    public void setValue(Object value) {
        //  setando o formato do cellrenderer
        try {
            if (value != null) {
                value = formatter.format(value);
            }
        } catch (IllegalArgumentException e) {
        }
        super.setValue(value);
    }

	/**
     *  método retorna formato para data
     */
    public static FormatRenderer getDateRenderer() {
        return new FormatRenderer(new SimpleDateFormat("dd/MM/yyyy"));
    }
    
    /**
     *  método retorna formato para data e hora
     */
    public static FormatRenderer getDateTimeRenderer() {
        return new FormatRenderer(DateFormat.getDateTimeInstance());
    }

    /**
     *  método retorna formato para hora
     */
    public static FormatRenderer getTimeRenderer() {
		//linha comentada é um formato de horario mais completo
        //return new FormatRenderer(DateFormat.getTimeInstance());
		return new FormatRenderer(new SimpleDateFormat("HH:mm"));
    }
}

import java.text.NumberFormat;
import javax.swing.SwingConstants;

/**
 * @author  Roberto Silva 
 * @brief 	classe é responsável pela formatação de dados numéricos
 */
public class NumberRenderer extends FormatRenderer {
    
    /*
     * No construtor da classe é passado o formato e setado o alinhamento á direta
     */
    public NumberRenderer(NumberFormat formatter) {
        super(formatter);
        setHorizontalAlignment(SwingConstants.RIGHT);
    }

    /**
     *  método retorna formato monetário
     */
    public static NumberRenderer getCurrencyRenderer() {
        return new NumberRenderer(NumberFormat.getCurrencyInstance());
    }

    /**
     *  método retorna formato inteiro
     */
    public static NumberRenderer getIntegerRenderer() {
        return new NumberRenderer(NumberFormat.getIntegerInstance());
    }

    /**
     *  método retorna formato percentual
     */
    public static NumberRenderer getPercentRenderer() {
        return new NumberRenderer(NumberFormat.getPercentInstance());
    }
	
	/**
     * usar para formatação numerica, com definição de casas decimais
     * @return 
     */
    public static NumberRenderer getNumberRenderer(int fraction) {
        NumberFormat nf=NumberFormat.getNumberInstance();
        nf.setMaximumFractionDigits(fraction);
        return new NumberRenderer(nf);
    }
}

Para setar o formato da coluna basta passar o TableColumnModel do JTable para o método “setTableColumnModel(TableColumnModel columnModel)”.

Abaixo código que faz a chamada ao método.

//variavel "table é uma instância de JTable"
//seleciona somente uma linha, caso prefira
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//desabilita tamanho dinâmico da coluna
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

//obtendo ColumnModel da JTable e setando formato
TableColumnModel columnModel = table.getColumnModel();
setTableColumnModel(columnModel);

Método responsável por setar formato e tamanho de colunas.

/**
 * seta formato e tamanho de colunas
 * @param columnModel 
 */
public void setTableColumnModel(TableColumnModel columnModel){        
	columnModel.getColumn(0).setCellRenderer(FormatRenderer.getDateTimeRenderer());
	columnModel.getColumn(1).setCellRenderer(FormatRenderer.getTimeRenderer());
	columnModel.getColumn(2).setCellRenderer(NumberRenderer.getPercentRenderer());
	columnModel.getColumn(3).setCellRenderer(NumberRenderer.getCurrencyRenderer());
        //caso queiram alterar o tamanho das colunas, setar o parâmetro setAutoResizeMode(JTable.AUTO_RESIZE_OFF); da JTable
        columnModel.getColumn(0).setPreferredWidth(150);
        columnModel.getColumn(1).setPreferredWidth(80);
        columnModel.getColumn(2).setPreferredWidth(60);
        columnModel.getColumn(3).setPreferredWidth(100);
}

Este método poderá estar em sua classe tablemodel caso prefiram, a chamada ficaria parecida com esta:
tableModel.setTableColumnModel(table.getColumnModel());

Obrigado pela visita, até o próximo post!

Fonte : http://tips4java.wordpress.com/2008/10/11/table-format-renderers/