packageorg.ws;importjava.awt.BorderLayout;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjavax.swing.JFrame;importjavax.swing.JTable;importjavax.swing.table.DefaultTableModel;publicclassConexao{@SuppressWarnings("empty-statement")publicstaticvoidmain(String[]args)throwsSQLException,ClassNotFoundException{Class.forName("com.mysql.jdbc.Driver");Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost/test","root","");StringstrSQL="select * from contatos";PreparedStatementstm=conn.prepareStatement(strSQL);ResultSetrs=stm.executeQuery();Object[]colunas={"Código","Nome","Fone","Email"};Object[][]linha=null;while(rs.next()){intid=rs.getInt("id");Stringnome=rs.getString("nome");Stringfone=rs.getString("fone");Stringemail=rs.getString("email");Object[][]dados={{id,nome,fone,email}};linha=dados;}DefaultTableModelmodelo=newDefaultTableModel(linha,colunas);JTabletabela=newJTable(modelo);JFramefrm=newJFrame("Tabela");frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.getContentPane().add(tabela,BorderLayout.CENTER);frm.pack();frm.setVisible(true);}}
… mas ele só me retorna apenas uma linha dados, mesmo que minha tabela tenha mais linhas.
O que pode estar errado? Eu já fiz isso uma vez e deu certo, mas agora não está dando. Alguém pode me ajudar?
1. Você cria um array com apenas 1 linha, a cada linha lida. Esse array não é acrescentado ao model, portanto, só o último será adicionado;
2. Você usa DefaultTableModel;
Para corrigir:
packageorg.ws;importjava.awt.BorderLayout;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjavax.swing.JFrame;importjavax.swing.JTable;importjavax.swing.table.DefaultTableModel;publicclassConexao{@SuppressWarnings("empty-statement")publicstaticvoidmain(String[]args)throwsSQLException,ClassNotFoundException{Class.forName("com.mysql.jdbc.Driver");Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost/test","root","");StringstrSQL="select * from contatos";PreparedStatementstm=conn.prepareStatement(strSQL);ResultSetrs=stm.executeQuery();Object[]colunas={"Código","Nome","Fone","Email"};DefaultTableModelmodelo=newDefaultTableModel(linha,colunas);while(rs.next()){intid=rs.getInt("id");Stringnome=rs.getString("nome");Stringfone=rs.getString("fone");Stringemail=rs.getString("email");//Adicione cada linha lida no seu modelmodelo.addRow(newObject[]{id,nome,fone,email});}JTabletabela=newJTable(modelo);JFramefrm=newJFrame("Tabela");frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.getContentPane().add(tabela,BorderLayout.CENTER);frm.pack();frm.setVisible(true);}}
ViniGodoy
Mas melhor que essa suporta correção acima é você fazer direito:
Crie uma classe Contato para guardar as informações de contato;
Crie uma classe ContatoDao, que terá o seu método de leitura do banco;
Faça o método contato Dao fazer a leitura e montar um List<Contato>;
Crie um ContatoTableModel, e passe esse list para ele;
Associe o model a tabela.
Ocupa um pouco mais de linhas de código, mas deixa o código mais modularizado e fácil de manter. Na verdade, é mais fácil desenvolver assim do que driblar as limitações do DefaultTableModel.
xwillianss
ViniGodoy:
Mas melhor que essa suporta correção acima é você fazer direito:
Crie uma classe Contato para guardar as informações de contato;
Crie uma classe ContatoDao, que terá o seu método de leitura do banco;
Faça o método contato Dao fazer a leitura e montar um List<Contato>;
Crie um ContatoTableModel, e passe esse list para ele;
Associe o model a tabela.
Ocupa um pouco mais de linhas de código, mas deixa o código mais modularizado e fácil de manter. Na verdade, é mais fácil desenvolver assim do que driblar as limitações do DefaultTableModel.
Legal, man. Muito esclarecedor, obrigado, já estou tendo outra visão em relação a JTable. Valeu mesmo…
A
anderson.brd
xwillianss:
ViniGodoy:
Mas melhor que essa suporta correção acima é você fazer direito:
Crie uma classe Contato para guardar as informações de contato;
Crie uma classe ContatoDao, que terá o seu método de leitura do banco;
Faça o método contato Dao fazer a leitura e montar um List<Contato>;
Crie um ContatoTableModel, e passe esse list para ele;
Associe o model a tabela.
Ocupa um pouco mais de linhas de código, mas deixa o código mais modularizado e fácil de manter. Na verdade, é mais fácil desenvolver assim do que driblar as limitações do DefaultTableModel.
Legal, man. Muito esclarecedor, obrigado, já estou tendo outra visão em relação a JTable. Valeu mesmo…
A idéia é essa mesmo, separar em pacotes distintos, assim você não se perde e tb fica mais fácil usando os imports do java.