Boa noite,
Fiz um JTable para apresentar os resultados de uma consulta.
Pela quantidade maciça de posts falando para não usar DefaultTableModel, eu resolvi seguir a dica e fiz um model conforme alguns posts do ViniGodoy.
Bom o código ficou assim:
package tela.model;
import estcar.LocalidadesPais;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class CadLocalidadesPaisTableModel extends AbstractTableModel {
private static final int COL_COD_PAIS = 0;
private static final int COL_DES_PAIS = 1;
private List<LocalidadesPais> valores;
public CadLocalidadesPaisTableModel(Collection<LocalidadesPais> valores){
this.valores = new ArrayList<LocalidadesPais>(valores);
}
@Override
public int getRowCount() {
return valores.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getColumnName(int columnIndex) {
String retorno = null;
if (columnIndex == COL_COD_PAIS) {
retorno = "Código";
}
if (columnIndex == COL_DES_PAIS) {
retorno = "Descrição";
}
return retorno;
}
@Override
public Object getValueAt(int row, int column) {
LocalidadesPais pais = valores.get(row);
switch(column){
case COL_COD_PAIS:
return pais.getCodPais();
case COL_DES_PAIS:
return pais.getDescPais();
default:
return null;
}
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
try {
if (columnIndex == COL_COD_PAIS) {
valores.get(rowIndex).setDescPais(aValue.toString());
}
} catch (Exception e) {
}
}
@Override
public Class getColumnClass(int columnIndex) {
switch(columnIndex){
case COL_COD_PAIS:
return Integer.class;
case COL_DES_PAIS:
return String.class;
default:
return null;
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == COL_DES_PAIS;
}
public LocalidadesPais get(int row) {
return valores.get(row);
}
public void add(LocalidadesPais pais) {
valores.add(pais);
fireTableRowsInserted(valores.size()-1, valores.size()-1);
}
public List<LocalidadesPais> getParametros() {
return Collections.unmodifiableList(valores);
}
}
Tenho algumas duvidas:
- Para cada tabela do meu sistema tenho ter uma TableModel diferente? Ou seja, se tiver 20 tabelas, terei que ter 20 classes estendendo a AbstractTableMode?
- Digamos que tenho mais de uma coluna editável, como ficaria o método isCellEditable, teria que criar IF e retornar true caso seja os índices das colunas igual ao parâmetro columnIndex?
- Em outros tópicos pessoal falou que o JTable é apenas a parte “vísivel”, e que para as informações do JTable serem inseridas no banco, precisaria buscar no model. É isso mesmo? Não entendi direito, exemplo, tenho meu model vou passar ele para o banco, mas como? Seria por aquele método public LocalidadesPais get(int row), ele iria me retornar uma lista de valores (objeto LocalidadesPais), então pegaria na lista e iria inserir nos campos do banco?
Gostaria de exemplos ou material de consulta/aprendizado para implementar o delete e edição dos campos apresentados na JTable, sabendo que não são todos os campos da tabela do banco listados. Gera uma pesquisa, e da pesquisa o que for editado quero gravar.
