como observei que existem muitas dúvidas em trabalhar com table, fiz um exemplo completo
neste exemplo utilizei um TableModel proprio, um TableRenderer (para a mudança de cor e coisas mais) e DefaultCellEditor
todos os campos sao editáveis, e mudando a profissao havera tb a mudanca de cor da linha
segue o codigo
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableModel;
/**
*
* @author marlon
*/
public class Tabela extends JFrame {
private JScrollPane scroll;
private JTable tabela;
private List<TabelaData> listaTabelaDatas;
public Tabela() {
init();
}
final void init() {
listaTabelaDatas = new LinkedList<TabelaData>();
listaTabelaDatas.add(new TabelaData("Profissional 1", 30, "Contador", 3000.2));
listaTabelaDatas.add(new TabelaData("Profissional 2", 26, "Programador", 3000.50));
listaTabelaDatas.add(new TabelaData("Profissional 3", 30, "Contador", 2800.0));
listaTabelaDatas.add(new TabelaData("Profissional 4", 30, "Estagiario", 500.75));
listaTabelaDatas.add(new TabelaData("Profissional 5", 30, "Programador", 3800.0));
listaTabelaDatas.add(new TabelaData("Profissional 6", 30, "Gerente", 3000.0));
listaTabelaDatas.add(new TabelaData("Profissional 7", 30, "Contador", 2000.0));
this.setTitle("Teste tabela");
this.setLayout(new BorderLayout());
tabela = new JTable(new TabelaModel(listaTabelaDatas));
tabela.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(new JComboBox(new String[]{"Contador","Programador","Estagiario","Gerente"})));
tabela.setDefaultRenderer(String.class, new TabelaRender());
tabela.setDefaultRenderer(Double.class, new TabelaRender());
tabela.setDefaultRenderer(Integer.class, new TabelaRender());
scroll = new JScrollPane(tabela);
this.add(scroll, BorderLayout.CENTER);
this.pack();
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String args[]) {
new Tabela();
}
}
/**
* Objeto que sera identificado na tabela
* @author marlon
*/
class TabelaData {
private String nome;
private Integer idade;
private String profissao;
private Double salario;
public TabelaData() {
}
public TabelaData(String nome, Integer idade, String profissao, Double salario) {
this.nome = nome;
this.idade = idade;
this.profissao = profissao;
this.salario = salario;
}
public Integer getIdade() {
return idade;
}
public void setIdade(Integer idade) {
this.idade = idade;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getProfissao() {
return profissao;
}
public void setProfissao(String profissao) {
this.profissao = profissao;
}
public Double getSalario() {
return salario;
}
public void setSalario(Double salario) {
this.salario = salario;
}
}
/**
* Modelo da tabela
* @author marlon
*/
class TabelaModel extends AbstractTableModel implements TableModel {
private List<TabelaData> listaTabelaData;
final String[] colunas = new String[]{"Nome", "Idade", "Profissao", "Salario"};
public TabelaModel() {
listaTabelaData = new LinkedList<TabelaData>();
}
public TabelaModel(List<TabelaData> listaTabelaData) {
this.listaTabelaData = listaTabelaData;
}
@Override
public int getRowCount() {
return listaTabelaData.size();
}
@Override
public int getColumnCount() {
return colunas.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
TabelaData tb = listaTabelaData.get(rowIndex);
switch (columnIndex) {
case 0:
return tb.getNome();
case 1:
return tb.getIdade();
case 2:
return tb.getProfissao();
case 3:
return tb.getSalario();
default:
return null;
}
}
@Override
public String getColumnName(int column) {
return colunas[column];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return String.class;
case 1:
return Integer.class;
case 2:
return String.class;
case 3:
return Double.class;
default:
return null;
}
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
TabelaData td = listaTabelaData.get(rowIndex);
switch (columnIndex) {
case 0:
td.setNome(aValue.toString());
break;
case 1:
td.setIdade(new Integer(aValue.toString()));
break;
case 2:
td.setProfissao(aValue.toString());
break;
case 3:
td.setSalario(new Double(aValue.toString()));
break;
}
listaTabelaData.set(rowIndex, td);
fireTableRowsUpdated(rowIndex, rowIndex);
}
public TabelaData getTabelaData(int rowIndex) {
return listaTabelaData.get(rowIndex);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
}
/**
* Classe responsavel pela representacao da tabela
* A mudança de cor está aqui
* @author marlon
*/
class TabelaRender extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
TabelaData t = ((TabelaModel) table.getModel()).getTabelaData(row);
JLabel c = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setOpaque(true);
//inicia diferença de cor
if (!isSelected) {
//se a linha nao for selecionada, muda a cor de fundo de acordo com a profissao e muda a cor da fonte para preto
c.setForeground(table.getForeground());
if (t.getProfissao().equals("Contador")) {
c.setBackground(Color.lightGray);
} else if (t.getProfissao().equals("Programador")) {
c.setBackground(Color.cyan);
} else if (t.getProfissao().equals("Gerente")) {
c.setBackground(Color.YELLOW);
} else {
c.setBackground(Color.white);
}
} else {
//caso contrario, muda a cor de fundo para cinza escuro e a fonte para a cor correspondente a profissao
c.setBackground(Color.darkGray);
if (t.getProfissao().equals("Contador")) {
c.setForeground(Color.lightGray);
} else if (t.getProfissao().equals("Programador")) {
c.setForeground(Color.cyan);
} else if (t.getProfissao().equals("Gerente")) {
c.setForeground(Color.YELLOW);
} else {
c.setForeground(Color.white);
}
}
//fim da diferenca de cor
//formata as celulas com valor numerico
if (value instanceof Double) {
c.setHorizontalAlignment(JLabel.RIGHT);
c.setText("R$" + new DecimalFormat("###,##0.00").format(t.getSalario()));
} else if (value instanceof Integer) {
c.setHorizontalAlignment(JLabel.RIGHT);
}
return c;
}
}
espero q esse exemplo seja útil a todos
ATT