Estou tentando montar um JTable para listar os clientes cadastrados em uma tabela Access, o código está funcionando, mas os dados apresentados são divergentes, minha tabela é composta de Código, Nome, etc… mas quando os dados são apresentados no JTable o valor do nome é inserida na coluna Código e a coluna nome fica vazia, meu código está ignorando os valores da coluna Código que esta como autonumeração.
Alguém poderia me ajudar?
Obrigado
packagecadastroSwing;importjava.awt.*;importjava.sql.*;importjavax.swing.*;importjava.util.*;publicclassRelatorioextendsJFrame{privatestaticfinallongserialVersionUID=1L;privateConnectioncon;privateJTabletabela;publicRelatorio(){super("Clientes");Stringurl="jdbc:odbc:Banco";Stringusuario="";Stringsenha="";try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");con=DriverManager.getConnection(url,usuario,senha);}catch(Exceptione){JOptionPane.showMessageDialog(null,"Conexão não estabelecida","Mensagem do Programa",JOptionPane.ERROR_MESSAGE);}buscaTabela();setSize(600,200);setVisible(true);}publicstaticvoidmain(Stringargs[]){Relatorioapp=newRelatorio();app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}privatevoidbuscaTabela(){Statementst;ResultSetres;try{Vectorcabecalho=newVector();Vectorlinhas=newVector();st=con.createStatement();res=st.executeQuery("SELECT codigo, nome FROM Clientes ORDER BY Nome");res.next();ResultSetMetaDatarsmd=res.getMetaData();for(inti=1;i<=rsmd.getColumnCount();++i)cabecalho.addElement(rsmd.getColumnName(i));do{linhas.addElement(proximaLinha(res,rsmd));}while(res.next());tabela=newJTable(linhas,cabecalho);JScrollPanescroller=newJScrollPane(tabela);getContentPane().add(scroller,BorderLayout.CENTER);scroller.setPreferredSize(newjava.awt.Dimension(592,144));validate();st.close();}catch(SQLExceptionsqlex){}}privateVectorproximaLinha(ResultSetrs,ResultSetMetaDatarsmd){VectorLinhaAtual=newVector();try{for(inti=1;i<=rsmd.getColumnCount();++i)switch(rsmd.getColumnType(i)){caseTypes.VARCHAR:LinhaAtual.addElement(rs.getString(i));break;caseTypes.TIMESTAMP:LinhaAtual.addElement(rs.getDate(i));break;caseTypes.NUMERIC:LinhaAtual.addElement(newLong(rs.getLong(i)));break;}}catch(SQLExceptione){}returnLinhaAtual;}}
privatevoidbuscaTabela(){
Statementst;ResultSetres;try{
Vectorcabecalho=newVector();Vectorlinhas=newVector();st=con.createStatement();res=st.executeQuery("SELECT codigo, nome FROM Clientes ORDER BY Nome");res.next();ResultSetMetaDatarsmd=res.getMetaData();//OContadordeColunasestácomeçandopor1,deveriaestarcomeçandoporzero,poisnojava,arraycontan-1.
for(inti=1; i <= rsmd.getColumnCount(); ++i)cabecalho.addElement(rsmd.getColumnName(i));do{
linhas.addElement(proximaLinha(res,rsmd));}while(res.next());tabela=newJTable(linhas,cabecalho);JScrollPanescroller=newJScrollPane(tabela);getContentPane().add(scroller,BorderLayout.CENTER);scroller.setPreferredSize(newjava.awt.Dimension(592,144));validate();st.close();}catch(SQLExceptionsqlex){
}
}
Fernando_Generoso_da
renan3006:
Este for não deveria começar do 0?
Isto é mais uma dúvida do que uma resposta em si…
Att.,
não…a primeira coluna realmente começa do 1…assim como no resultset também está correto começar do 1.
M
massucato
Fernando Generoso da Rosa:
renan3006:
Este for não deveria começar do 0?
Isto é mais uma dúvida do que uma resposta em si…
Att.,
não…a primeira coluna realmente começa do 1…assim como no resultset também está correto começar do 1.
Usei como base o seu, deu certo aqui, segue anexo print.
Estou usando o Oracle XE, arrumei alguns trechos, só mudar o driver a string SQL e ve se funciona...
packagenovoprojeto;importjava.awt.*;importjava.sql.*;importjavax.swing.*;importjava.util.*;importoracle.jdbc.driver.OracleDriver;publicclassRelatorioextendsJFrame{privateConnectionconnection;privateJTablejTable;publicRelatorio(){super("Emploeyees");Stringurl="jdbc:oracle:thin:@localhost:1521:XE";Stringusername="system";Stringpassword="1";try{Class.forName("oracle.jdbc.driver.OracleDriver");connection=DriverManager.getConnection(url,username,password);buildJTable();this.setSize(600,200);this.setVisible(true);this.setEnabled(true);}catch(Exceptionexception){JOptionPane.showMessageDialog(null,"Conexão não estabelecida","Mensagem do Programa",JOptionPane.ERROR_MESSAGE);}}publicstaticvoidmain(Stringargs[]){Relatorioapp=newRelatorio();app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}privatevoidbuildJTable(){Statementstatement;ResultSetresultSet;try{VectorjTableHeader=newVector();VectorjTableRows=newVector();StringscriptSQL;scriptSQL="SELECT EMPLOYEE_ID";scriptSQL+=", FIRST_NAME";scriptSQL+=", LAST_NAME";scriptSQL+=", PHONE_NUMBER";scriptSQL+=" FROM HR.EMPLOYEES";scriptSQL+=" ORDER BY FIRST_NAME";statement=connection.createStatement();resultSet=statement.executeQuery(scriptSQL);resultSet.next();ResultSetMetaDatarsMetaData=resultSet.getMetaData();for(inti=1;i<=rsMetaData.getColumnCount();++i)jTableHeader.addElement(rsMetaData.getColumnName(i));do{jTableRows.addElement(nextRow(resultSet,rsMetaData));}while(resultSet.next());jTable=newJTable(jTableRows,jTableHeader);JScrollPanejScrollPane=newJScrollPane(jTable);getContentPane().add(jScrollPane,BorderLayout.CENTER);jScrollPane.setPreferredSize(newjava.awt.Dimension(592,144));validate();statement.close();}catch(SQLExceptionexception){}}privateVectornextRow(ResultSetresultSet,ResultSetMetaDatarsMetaData){VectorcurrentRow=newVector();try{for(inti=1;i<=rsMetaData.getColumnCount();++i){switch(rsMetaData.getColumnType(i)){caseTypes.VARCHAR:currentRow.addElement(resultSet.getString(i));break;caseTypes.TIMESTAMP:currentRow.addElement(resultSet.getDate(i));break;caseTypes.NUMERIC:currentRow.addElement(newLong(resultSet.getLong(i)));break;}}}catch(SQLExceptionexception){}returncurrentRow;}}
Lembrando sempre que é uma boa pratica de programação implementar seu proprio TableModel, aqui no guj já tem bons tutoriais.
Sim cada passo deste sendo realizado em classes diferentes pra dividir as responsabilidades, tá tudo em um unico local.
ps1: Eu iria tentar assim, mas pode não ser a melhor solução.
ps2: Pra armazenar os valores vindos seria melhor utilizar um ArrayList invés da classe Vector - opinião.