Sim.
Imagina que eu tenho um resultset e já quero inicicia-lo na tabela:
Eu tenho minha classe assim:
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class ModeloTabela extends AbstractTableModel {
private static final long serialVersionUID = 1L;
DAO DAO = new DAO();
private String[] colunas = {"ID Componente", "Componente", "Servidor de Origem", "Servidor de Destino", "Alias do Componente", "Ordem de Origem", "Ordem de Destino"};
/* Lista de Sócios que representam as resultado. */
private List<InfraBridge> resultado;
public ModeloTabela() throws SQLException {
resultado = DAO.consulta();
}
/* Retorna a quantidade de colunas. */
@Override
public int getColumnCount() {
// Está retornando o tamanho do array "colunas".
// Mas como o array é fixo, vai sempre retornar 4.
return colunas.length;
}
/* Retorna a quantidade de resultado. */
@Override
public int getRowCount() {
// Retorna o tamanho da lista de sócios.
return resultado.size();
}
/* Retorna o nome da coluna no Ãndice especificado.
* Este método é usado pela JTable para saber o texto do cabeçalho. */
@Override
public String getColumnName(int columnIndex) {
// Retorna o conteúdo do Array que possui o nome das colunas
// no Ãndice especificado.
return colunas[columnIndex];
};
/* Retorna a classe dos elementos da coluna especificada.
* Este método é usado pela JTable na hora de definir o editor da célula. */
@Override
public Class<?> getColumnClass(int columnIndex) {
// Retorna a classe referente a coluna especificada.
// Aqui é feito um switch para verificar qual é a coluna
// e retornar o tipo adequado. As colunas são as mesmas
// que foram especificadas no array "colunas".
switch (columnIndex) {
case 0: // Primeira coluna é o nome, que é uma String.
return int.class;
case 1: // Segunda coluna é o telefone, que também é uma String..
return String.class;
case 2: // Terceira coluna é a data de cadastro,
// apesar de ser do tipo Calendar,
// estou retornando Date por causa da formatação.
return String.class;
case 3: // Quarta coluna é a mensalidade, um double.
return String.class;
case 4: // Quarta coluna é a mensalidade, um double.
return String.class;
case 5: // Quarta coluna é a mensalidade, um double.
return int.class;
case 6: // Quarta coluna é a mensalidade, um double.
return int.class;
default:
// Se o Ãndice da coluna não for válido, lança um
// IndexOutOfBoundsException (Exceção de Ãndice fora dos limites).
// Não foi necessário verificar se o Ãndice da linha é inválido,
// pois o próprio ArrayList lança a exceção caso seja inválido.
throw new IndexOutOfBoundsException("columnIndex out of bounds");
}
}
/* Retorna o valor da célula especificada
* pelos Ãndices da linha e da coluna. */
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
// Pega o sócio da linha especificada.
InfraBridge infraBridge = resultado.get(rowIndex);
// Retorna o campo referente a coluna especificada.
// Aqui é feito um switch para verificar qual é a coluna
// e retornar o campo adequado. As colunas são as mesmas
// que foram especificadas no array "colunas".
switch (columnIndex) {
case 0: // Primeira coluna é o nome.
return infraBridge.getidComponente();
case 1: // Segunda coluna é o telefone.
return infraBridge.getComponente();
case 2: // Terceira coluna é a data de cadastro.
return infraBridge.getServidorOrigem();
case 3: // Quarta coluna é a mensalidade.
return infraBridge.getServidorDestino();
case 4: // Quarta coluna é a mensalidade.
return infraBridge.getAliasComponente();
case 5: // Quarta coluna é a mensalidade.
return infraBridge.getOrdem1();
case 6: // Quarta coluna é a mensalidade.
return infraBridge.getOrdem2();
default:
// Se o Ãndice da coluna não for válido, lança um
// IndexOutOfBoundsException (Exceção de Ãndice fora dos limites).
// Não foi necessário verificar se o Ãndice da linha é inválido,
// pois o próprio ArrayList lança a exceção caso seja inválido.
throw new IndexOutOfBoundsException("columnIndex out of bounds");
}
}
}
Está errado???
Seu TableModel não deve ser responsavel por consultar dados no banco de dados. Prefira trabalahr com listas e o resultado poderá vir de qualquer lugar.
Olá pessoal, estou tentando utilizar o AbstractTableModel, porém, estou com problemas ao inserir um dado na tabela. Ela não está atualizando.
Bom na janela onde fica a tabela eu chamo a tela de inserção:
InserirMarcaGui im = new InserirMarcaGui();
im.setVisible(true);
Na tela de inserção botão salvar:
[code] private void botaoSalvarActionPerformed(java.awt.event.ActionEvent evt) {
Marca m = new Marca();
if (txNome.getText().length() > 0) {
m.setNome(txNome.getText());
MarcaTableModel mtb = new MarcaTableModel();
mtb.addMarca(m);
MarcaController mc = new MarcaController();
mc.cadastrar(m);
dispose();
}
}[/code]
Não consigo encontrar o erro. Está salvando no banco de dados. Porém a tabela não atualiza. Tenho que fechar a janela para visualizar a modificação.
Pessoal, já consegui resolver.
Você está criando um model novo, atualize o já existente.
if (txNome.getText().length() > 0) {
m.setNome(txNome.getText());
MarcaTableModel mtb = jTable.getModel();
mtb.addMarca(m);
mtb.notifyDataSetChanged();
MarcaController mc = new MarcaController();
mc.cadastrar(m);
dispose();
}
É Marky.Vasconcelos perdi um tempão por um erro tão besta. Mas já está tudo ok.
Obrigada pela ajuda.
Caramba já havia estudado DefaultTableModel e não consegui implementar mas agora com esse tópico consegui implementar a tabela do jeito certo. obrigado
Muito mais fácil criar o seu próprio tableModel.
Eu o tenho usado como um classe intermediária entre o a minha BO e a swing. Está certo usá-la desse jeito?
E se eu quiser que no meu JTable apareça menos campos do que tem na minha tabela? por exemplo:
Tabela: PKID_CODIGO, VALOR, DESCRICAO, FKID_ITEM, FKID_GRUPO, FKID_CONTA
e no meu JTable eu só quero que apareça: DESCRICAO, VALOR E FKID_ITEM.
como seria isso? é possível?
Como posso usar um TableModel personalizado com uma JList?
Não é tão simples, e nem envolve necessariamente o TableModel personalizado.
a) Preencher um JList com os valores possíveis da coluna;
b) Criar um TableCellEditor que trabalhe com o List;
c) Associar o TableCellEditor a coluna em questão.
Leia mais em: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender
Vou dar uma analisada na documentacao
Muito obrigado pela atencao