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/