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!