Boa noite galera,
Estou com dúvidas sobre como exibir no Jtable os dados vindos do meu BD. Segue abaixo uma parte do meu código, gostaria se possível, que os colegas me dessem uma orientação do que estaria errado, visto que quando eu salvo uma informação no banco, era para ser exibido essa informação já no Jtable, porem no momento isso não tem ocorrido e também não tem sido retornada nenhuma mensagem de erro para auxilio.
public void PreencherTabela() {
CadastrarClasseDAO dao; //Chamo minha DAO
try {
dao = new CadastrarClasseDAO();
List<Classes> listardados = dao.RetornaTabela(); //Cria uma lista q pega o retorno do meu metodo contendo os dados do BD
DefaultTableModel modelo = new DefaultTableModel(null, new String[] {"id", "nome"});
JTable tabela = new JTable(modelo);
for(Classes x : listardados) {
String[] dados = new String[2];
dados[0] = (String.valueOf(x.getId()));
dados[1] = x.getNome();
modelo.addRow(dados);
}
tabela.setVisible(true);
}
catch (SQLException ex) {
Logger.getLogger(CadastrarDadosIgreja.class.getName()).log(Level.SEVERE, null, ex);
}
}
Desde já obrigado a todos pela atenção em responder.
Pelo visto, seu BD retorna todas as informações do banco e depois joga em uma classe.
Eu sempre achei melhor fazer isto logo na busca que o programa faz no banco… onde no final do método onde ele retorna a primeira linha do banco, ele já adiciona na linha da minha Jtable.
Ele busca a primeira linha, e em vez de retornar a mesma para outro método, já manda para a linha da JTable.
Claro que existem formas corretas de se fazer isto, mais acho que fazendo direito com um código bem comentado e nada bagunçado… o importante e funcionar e não retornar bugs…
Só gostaria de um exemplo dos amigos de como exibir esses dados no meu JTable, eu consegui exibir em um “System.out.println” na linha 16 do meu codigo passado anteriormente, todo o conteúdo da minha lista, que seria as informações vindas do banco, ou seja, ta tudo certinho, as informações estão chegando na minha VIEW, só não estou sabendo como exibir isso no meu JTable, gostaria então de um exemplo.
Desde já agradeço a colaboração de todos!!!
Se você já está conseguindo ter os dados corretamente, então já e meio passo andado… chegando em casa eu vou postar um exemplo aqui que tenho salvado no meu netbeans. Ele faz a busca no banco e já adiciona na jtable. Não sei se fiz o uso do DefaultTableModel. Mais só estou saindo do trabalho e já te mando.
Comece aprendendo a fazer seu próprio TableModel.
Veja o link ao lado do texto em vermelho na minha assinatura.
Bom dia a todos!
Primeiro gostaria de agradecer o Vinigodoy pela resposta e pelos links repassados sobe o uso do TableModel, tem sido de grande ajuda no aprendizado, porem gostaria de tirar mais uma dúvida com meus amigos, seguinte, segui um dos muitos exemplos do Vinigodoy e agora já estou conseguindo exibir em minha JTable o dado cadastrado naquele momento, porem ainda não estou conseguindo carregar os dados vindos do BD, não consegui entender muito bem como fazer isso puxando as info da minha classe DAO que possui um metodo q retorna uma list contendo meus dados e reutilizando essa info na minha JTable, segue abaixo um exemplo de minha DAO, se alguem puder dar uma clareada, eu ficaria grato desde já:
public List<Classes> RetornaTabela() {
String sql = "select * from Classes";
PreparedStatement stmt;
try {
stmt = connection.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while(rs.next()){
Classes classe = new Classes();
classe.setId(rs.getInt("id"));
classe.setNome(rs.getString("nome"));
dados.add(classe);
}
} catch (SQLException ex) {
Logger.getLogger(CadastrarDadosDAO.class.getName()).log(Level.SEVERE, null, ex);
}
return dados;
}
Queria saber agora se eu poderia repassar os dados de minha list “Dados” para o construtor da minha classe “Exbir_Classe_Table” que é uma classe seguindo exatamente o mesmo conceito do repassado por Vinigodoy.
public class Exibir_Classe_Table extends AbstractTableModel{
CadastrarClasseDAO dao = new CadastrarClasseDAO();
/* Lista de Classes que representam as linhas. */
private List<Classes> linhas = dao.RetornaTabela();
/* Array de Strings com o nome das colunas. */
private String[] colunas = new String[] {
"id", "nome"};
/* Cria um ClasseTableModel vazio. */
public Exibir_Classe_Table() {
linhas = new ArrayList<Classes>();
}
/* Cria um ClasseTableModel carregado com
* a lista de classes especificadas. É o que está sendo usado no momento */
public Exibir_Classe_Table(List<Classes> listaDeClasses) {
linhas = new ArrayList<Classes>(listaDeClasses);
}
/* Retorna a quantidade de colunas. */
public int getColumnCount() {
// Está retornando o tamanho do array "colunas".
// Mas como o array ja está fixo, vai sempre retornar 2.
return colunas.length;
}
/* Retorna a quantidade de linhas. */
public int getRowCount() {
// Retorna o tamanho da lista de classes.
return linhas.size();
}
/* Retorna o nome da coluna no indice especificado.
* Este método é usado pela JTable para saber o texto do cabeçalho. */
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. */
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 id, que é um int.
return Integer.class;
case 1: // Segunda coluna é o nome, que também é uma String..
return String.class;
default:
// Se o indice da coluna não for válido, lança um
// IndexOutOfBoundsException (Exceção de indice fora dos limites).
// Não foi necessário verificar se o indice da linha é inválido,
// pois o proprio ArrayList lança a exceção caso seja inválido.
throw new IndexOutOfBoundsException("columnIndex out of bounds");
}
}
Eu fiz também uma atribuição nessa classe aonde repasso o retorno de minha list “Dados” para
private List linhas = dao.RetornaTabela();
public Exibir_Classe_Table() {
linhas = new ArrayList<Classes>();
}
Gostaria de saber então se realmente seria dessa forma que eu devo trabalhar para exibir os dados em minha JTable vindos do BD.
Você não está seguindo o mesmo conceito que passei. O TableModel não possui lógica para carga de dados do banco. Além disso, o seu código carrega a lista no campo, mas seus construtores destroem a lista carregada.
Para ficar certo, faça o seguinte:
- Apague a linha 03.
- Troque a linha 5 para:
private List<Classes> linhas;
- Na hora de criar o TableModel, faça:
Exibir_Classe_Table model = new Exibir_Classe_Table(
new CadastrarClasseDAO().RetornaTabela());
Boa tarde a todos!!!
Vinigodoy vc é o cara rapaz!!! rs, consegui exibir meus dados na minha Jtable e acredito ter tido uma boa noção de como usar e trabalhar com a TableModel agora, realmente estava fazendo um pouco de confusão sobre a forma como iria pegar as informações vindas de minha lista, mas com o seu exemplo ficou mamão com açucar, keria te agradecer demais mais uma vez pela ajuda!!!
Agora é dar continuidade no meu projeto aqui e na medida quer for tendo dúvidas espero contar com a ajuda de vc e de todos!!! Um grande abraço!!!