Qual o problema da minha AbsctractTableModel?
Minha classe que estende AbstractTableModel recebe parâmetros para preenchimento das colunas e das linhas como vetores.
A primeira coluna é formada por booleans que se tornam check-boxes. O problema é: quando seleciono uma célula que é editável (isto é, o método isCellEditable(int row, int col){…} retorna true para tal célula) e depois uma célula da 1ª coluna, esta se deforma.
Isso não acontece quando a célula selecionada antes da célula da 1ª coluna é não-editável (isto é, o método isCellEditable(int row, int col){…} retorna false).
Falta configurar alguma coisa? =(
import javax.swing.table.AbstractTableModel;
import java.util.Vector;
public class MyTableModel extends AbstractTableModel {
private Vector rows;
private Vector columns;
// construtor 1:
public MyTableModel() {
setRows(new Vector(1, 1));
setColumns(new Vector(1, 1));
}
// construtor 2:
public MyTableModel(Vector rows, Vector columns) {
this.rows = rows;
this.columns = columns;
}
public int getRowCount() {
return rows.size();
}
public int getColumnCount() {
return getColumns().size();
}
public String getColumnName(int col) {
return String.valueOf(getColumns().get(col));
}
public Class getColumnClass(int col) {
return getValueAt(0, col).getClass();
}
public Object getValueAt(int row, int col) {
return ((Vector) getRows().get(row)).get(col);
}
public void setValueAt(Object value, int row, int col) {
((Vector) getRows().get(row)).setElementAt(value, row);
fireTableCellUpdated(row, col);
}
public boolean isCellEditable(int row, int col) {
return false;
//return true;
}
public Vector getRows() {
return rows;
}
public void setRows(Vector rows) {
this.rows = rows;
this.fireTableRowsUpdated(0, rows.size());
}
public Vector getColumns() {
return columns;
}
public void setColumns(Vector columns) {
this.columns = columns;
this.fireTableDataChanged();
}
} //FIM DA CLASSE.
O código abaixo é executado quando um botão é pressionado:
JTable table = new JTable();
...
MyTableModel mtm = new MyTableModel();
Vector columns = new Vector(1, 1);
columns.add("Remover?");
columns.add("Matrícula");
columns.add("Nome");
Vector rows = new Vector(1, 1);
Vector row = new Vector(1, 1);
row.add(new Boolean(true));
row.add("[telefone removido]-7");
row.add("Antonioni de Araújo Rocha");
rows.add(row);
mtm.setRows(rows);
mtm.setColumns(columns);
table.setModel(mtm);
table.getColumnModel().getColumn(0).setMaxWidth(70);
table.repaint();
A tabela aparece perfeita.
Quando a tabela aparece, está perfeita:

Se seleciono uma célula qualquer que é editável, …

… e depois uma célula da 1ª coluna (editável ou não), esta se deforma com o valor da célula anterior:

Isto não ocorre se as células são não-editáveis:

Gurus do JTable, help…


