Eu tenho 2 dúvidas: a primeira é o seguinte, como podem ver na imagem abaixo é um painel de controle de users do sistema. Gostaria de que na ‘aba’ excluir usuário eu tenha a lista dos usuário no JComboBox e quando um user é selecionado os dados como Nome e Login aparelam nos textfields e que quando acionado o botao excluir, seja feita a exclusão do user selecionado, não estou conseguindo fazer isso. Você podem ver que eu estou me batendo com alguns problemas bem básicos, mas estou iniciando em Java. A 2ª dúvida consiste em listar novamente os users do BD, mas em uma JTable.
1º. Usando uma combobox eu possa ter a listagem dos usuário do BD, e selecioando 1 deles, os 2 campos sejam alimentados com os dados do BD e eu possa fazer a exclusão.
2º. Listar os dados do BD em uma simples tabela.
Tudo bem que são dúvidas simples pra vocês, mas pra mim esta consumindo um tempo do qual infelizmente eu não disponho.
att,
JP
JP1
Uma parte da minha primeira dúvida eu consegui solucionar.
para alimentar a combobox:
publicstaticvoidatualizaComboBox(){jcbExcluiUsers.removeAllItems();StringdbURL="jdbc:mysql://localhost/jusms"; Connection c = null; ResultSet r = null; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); c = DriverManager.getConnection(dbURL, "", ""); Statement s = c.createStatement(); r = s.executeQuery("SELECT*FROMusers"); while (r.next()) jcbExcluiUsers.addItem(r.getString("login"));}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(SQLExceptione){e.printStackTrace();}finally{try{r.close();c.close();}catch(SQLExceptione1){e1.printStackTrace();}}}
Agora eu não sei como fazer para que quando seja selecionado um usuário, os seus dados sejam carregados nos textfields.
JP1
Pessoal, como eu atualizo um tabela no java? Eu tenho uma tabela mas ela toda vez que é feita a atualização dela, os dados se repetem, como acabar com isso?
Outro detalhe, você viram nos outros posts deste tópico, que eu preciso resolver outro probleminha, que é como que, quando selecionado um usuário do ComboBox, os dados como NOME & LOGIN deste mesmo usuário sejam jogados nos 2 TextFields?
Fico no aguardo.
:thumbup:
JP1
Alguém pode me ajudar com isso?
Rafael_Steil
Oi JP,
nao fique encanado nao. Programacao em Swing eh bem menos comum que programacao Web, e portanto, mais dificil de encontrar pessoas que tenham uma boa experiencia.
Se ninguem respondeu, eh pq realmente nao sabem, ou pq nao entenderam a sua duvida :).
Rafael
JP1
Eu to tranquilo, é que eu preciso deixar meu sistema redondo, pois é com ele q eu pego meu certificado.
Mas to tranquilo, o que eu quero simplesmente é quando selecionar um Item da combobox os dados do usuários sejam mostrados nos 2 campos da tela que eu postei.
a outra dúvida nada mais é que, a cada consulta ao banco de dados, a tabela seja “zerada” e os dados sejam jogados nela.
mas eu nao to estressado não.
Rafael_Steil
Sobre “tabela”, vc se refere a uma jtable ou uma tabela do banco de dados?
Rafael
JP1
JTable.
C
CharlesVHL
Para listar os dados:
Aqui está um Model bem simples de uma tabela que mostra os continentes cadastrados no BD:
packageobjetos;importbancodados.Conexao;importjavax.swing.table.AbstractTableModel;importjava.util.Vector;publicclassContinenteTableModelextendsAbstractTableModel{//Títulos das colunas.staticprotectedString[]columnNames={"Continente"};// Tipos das colunas.staticprotectedClass[]cTypes={String.class};//Array com informações dos continentes.protectedContinente[]o;publicContinenteTableModel(){o=newContinente[0];}publicContinenteTableModel(Conexaocon){Continentec=newContinente();Vectorv=newVector();v=c.loadTableModel(con);//Consulta no BD.o=newContinente[v.size()];v.copyInto(o);}publicvoidaddValue(ContinentepJ){intq=o.length;Continente[]u=newContinente[q+1];for(intr=0;r<q;r++){u[r]=o[r];}u[u.length-1]=pJ;o=newContinente[u.length];o=u;}publicvoiddeleteValue(ContinentepJ){intq=o.length;Continente[]u=newContinente[q-1];booleans=false;for(intr=0;r<q;r++){if(o[r].getCodContinente()==pJ.getCodContinente()){if(r<u.length)u[r]=o[r+1];s=true;}else{if(r<u.length){if(!s){u[r]=o[r];}else{u[r]=o[r+1];}}}}o=newContinente[q-1];o=u;}/** Returns the number of columns in the model. A * <code>JTable</code> uses this method to determine how many columns it * should create and display by default. * * @return the number of columns in the model * @see #getRowCount * */publicintgetColumnCount(){returncolumnNames.length;}publicStringgetColumnName(intcolumn){returncolumnNames[column];}/** Returns the number of rows in the model. A * <code>JTable</code> uses this method to determine how many rows it * should display. This method should be quick, as it * is called frequently during rendering. * * @return the number of rows in the model * @see #getColumnCount * */publicintgetRowCount(){returno.length;}/** Returns the value for the cell at <code>columnIndex</code> and * <code>rowIndex</code>. * * @param rowIndex the row whose value is to be queried * @param columnIndex the column whose value is to be queried * @return the value Object at the specified cell * */publicObjectgetValueAt(introwIndex,intcolumnIndex){if(rowIndex<o.length){switch(columnIndex){//-1 - para quando eu quiser buscar o Registro inteiro.case-1:returno[rowIndex];case0:returnnewString(o[rowIndex].getContinente());default:returnnull;}}elsereturnnull;}publicClassgetColumnClass(intc){returncTypes[c];}/* * Don't need to implement this method unless your table's * data can change. */publicvoidsetValueAt(Objectvalue,introw,intcol){if(row<o.length){switch(col){case0:o[row].setContinente(value.toString());break;}}fireTableCellUpdated(row,col);}}
Aqui está o objeto Continente, pode ver que eu crio um Array do tipo Continente no TableModel, ali que eu guardo os registros lidos no BD:
A classe a seguir é onde eu defino as consultas no BD:
packagebancodados;importobjetos.Continente;importobjetos.ValidaData;importjava.sql.*;importjava.util.*;publicclassBDContinente{publicVectorloadTableModel(Conexaocon){Continentec;Vectortabela=newVector(1,10);try{Statementstatement=con.connect.createStatement();Stringquery="SELECT * FROM Continente ORDER BY Continente ASC";ResultSetrs=statement.executeQuery(query);try{while(rs.next()){c=newContinente();c.setCodContinente(rs.getInt("CodContinente"));c.setContinente(rs.getString("Continente"));tabela.addElement(c);}}catch(SQLExceptionsqlex){sqlex.printStackTrace();}statement.close();}catch(SQLExceptionsqlex){sqlex.printStackTrace();}tabela.trimToSize();returntabela;}}
Você deve criar uma instância de Conexao para se conectar ao BD (já deixei configurado para o seu BD):
packagebancodados;importjava.util.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.sql.*;publicclassConexao{publicConexao(){try{url="jdbc:mysql://localhost/jusms";Class.forName("com.mysql.jdbc.Driver").newInstance();connect=DriverManager.getConnection(dbURL,"","");conexao=true;status="Conexão com banco de dados ativado.";}catch(ClassNotFoundExceptioncnfex){cnfex.printStackTrace();conexao=false;status="Conexão com banco de dados desativado.";}catch(Exceptionex){ex.printStackTrace();status="Conexão com banco de dados desativado.";}}publicvoiddisconnect(){try{connect.close();}catch(Exceptione){}}publicConnectiongetConexao(){returnconnect;}publicStringgetStatus(){returnstatus;}protectedStringurl;protectedStringstatus;protectedbooleanconexao;protectedConnectionconnect;}
Agora que você já possui o TableModel, o Objeto e a Consulta ao BD é só montar o TableModel e setá-lo na JTable. Declare as variáveis a seguir na classe onde está o JTable...
...e no construtor desta mesma classe faça como no código a seguir:
//conexao - instância da classe Conexao.cTM=newContinenteTableModel(conexao);tabPrincipal.setModel(sorter);
Sempre que você quiser atualizar o JTable, basta criar novamente o cTM (cTM = new ContinenteTableModel(conexao)) e setá-lo na JTable. Eu faço assim e funciona bem. Espero que não tenha ficado muito confuso. Se precisar de ajuda estamos ai.
pauloperes
JP@,
Ja tentou fazer desta forma:
// Cria um evento para o JcomboboxprivatevoidTeste(java.awt.event.InputMethodEventevt){// Recebe o valor do comboboxStringx=(String)fieldEstagio.getSelectedItem();// Faz uma pesquisa na base de dados de acordo com a StringfiledNome.setText(Fazqueelerecebaapesquisa);fildLogin.setText(mesmacoisadoitemdecima);}
Valeus,
Paulo
JP1
pauloperes:
JP@,
Ja tentou fazer desta forma:
// Cria um evento para o JcomboboxprivatevoidTeste(java.awt.event.InputMethodEventevt){// Recebe o valor do comboboxStringx=(String)fieldEstagio.getSelectedItem();// Faz uma pesquisa na base de dados de acordo com a StringfiledNome.setText(Fazqueelerecebaapesquisa);fildLogin.setText(mesmacoisadoitemdecima);}
Valeus,
Paulo
Vou tentar isso Paulo, obrigado.
:thumbup:
CharlesVHL, muito obrigado também, como disse no outro tópico, vou olhar a noite em casa, e se surgirem dúvidas eu volto aqui.
Obrigado mesmo.
:thumbup:
JP1
pauloperes:
JP@,
Ja tentou fazer desta forma:
// Cria um evento para o JcomboboxprivatevoidTeste(java.awt.event.InputMethodEventevt){// Recebe o valor do comboboxStringx=(String)fieldEstagio.getSelectedItem();// Faz uma pesquisa na base de dados de acordo com a StringfiledNome.setText(Fazqueelerecebaapesquisa);fildLogin.setText(mesmacoisadoitemdecima);}
Valeus,
Paulo
Paulo eu tentei mas nao deu certo.
Olha o q eu fiz...
esse método preenche o combobox:
publicstaticvoidatualizaComboBox(){jcbExcluiUsers.removeAllItems();StringdbURL="jdbc:mysql://localhost/jusms"; Connection c = null; ResultSet r = null; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); c = DriverManager.getConnection(dbURL, "", ""); Statement s = c.createStatement(); r = s.executeQuery("SELECT*FROMusers"); while (r.next()) jcbExcluiUsers.addItem(r.getString("login"));}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(SQLExceptione){e.printStackTrace();}finally{try{r.close();c.close();}catch(SQLExceptione1){e1.printStackTrace();}}}
Este é para pegar o item selecionado e preenchers dos campos da tela.
publicvoidExcluiUsuario(){Stringescolhido=(String)jcbExcluiUsers.getSelectedItem();StringdbURL="jdbc:mysql://localhost/jusms";Connectionc=null;ResultSetr=null;try{Class.forName("com.mysql.jdbc.Driver").newInstance();c=DriverManager.getConnection(dbURL,"","");Statements=c.createStatement();r=s.executeQuery("SELECT * FROM users WHERE login = '"+escolhido+"'");while(r.next()){jtfExcluiNome.setText(r.getString("nome"));jtfExcluiLogin.setText(r.getString("login"));}}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(SQLExceptione){e.printStackTrace();}finally{try{r.close();c.close();}catch(SQLExceptione1){e1.printStackTrace();}}}
o q eu fiz de errado???
pauloperes
JP@,
Veja sua caixa de mensagens privadas, eu respondi tua mensagem lá!
Valeu,
Paulo
pauloperes
JP@,
Seguinte vc me disse que quando a aplicação é iniciada é preenchido os campos automaticamente de acordo com os dados do jcombobox, para que vc consiga mudar os dados dos fields quanto é mudado o item do jcombobox, vc precisa construir uma função que trata o evento correspondente, fiz um pequeno exemplo aqui na minha e funcionou blz.
obs. usei o Netbeans, mas acho q naum vai ser problema para vc.
No teu caso é só mudar abrindo uma conexão com o banco e fazer o select passando o getSelectedItem do jcombobox.
Caso vc esteje usando também o Netbeans, é só ir na aba Events que aparece quando vc clica em um determinado componente, depois vc seleciona o evento itemStateChanged.
Qualquer dúvida retorne.
Atenciosamente,
Paulo Henrique Peres
JP1
Cara, eu nao consegui fazer ainda…
tem como vc me da um help?
pauloperes
Kra,
Tem sim, meu vc naum é de Umuarama, vc faz Sistemas na Unipar, se fizer é fácil da até pra gente se falar na facu.
Valeu,
Paulo
JP1
Consegui fazer.
Só a tabela que não tem jeito… ela continua nao funcionando como deveria.
ps.: Teadicionei no mSN…]
Infelizmente eu nasci em Umuarama, mas agora to morando e estudando em Joinville/SC.
JP1
Galera…
continuo ainda com problemas com minha tabela, os metodos repaint(), revalidate() não funcionam.
toda vez que eu atualizo um dado e mando atualizar a tabela, ela duplica o q estava antes, e adiciona o novo dado.
COmo eu resolvo isso.
pauloperes
JP,
Seguinte meu, para vc atualizar a tabela é só adicionar uma linha a sue Model da Tabela, e ele que controla os dados que iram aparecer na sua tabela.
Vou tentar fazer um pequeno código mais tarde, dae eu te mando.
Valeu,
Paulo Henrique Peres
Thiago_Senna
Sim, vc pode fazer isso!
Sim, vc pode fazer isso também!
JP… Swing é meio embaçado mesmo, e difícil de encontrar realmente domina o assunto. Como vc é iniciante, essas suas dúvidas são naturais, no entanto, para vc lidar melhor com estas suas dúvidas, em minha opinião faltou vc procurar conhecer um pouco mais de cada um desses componentes que você citou. Uma vez que você conhece seus métodos e o que eles retornar ou o que eles aceitam como parâmetro, a sua criatividade se encarregaria de trazer para você a solução de seus problemas.
Quando estou trabalhando com swing, confesso, sei pouco, mas eu sempre deixo meu firefox com o seguinte link aberto:
A minha dica pra vc é a seguinte. Quando vc quiser saber se alguma coisa com tal é possível, pesquise sobre ele, e estude apenas ele, e veja se ele serve pra vc! Assim, vc continua tocamdo bém o seu projeto, além de aprender Swing bém!
Não leve essas minhas dicas a mau. Eu programo assim. Penso em componente que seria ideal para o meu problema e aprendo ele, e logo em seguida já aplico no projeto!
Outra referência para aprender swing é o livro do Deitel! Particularmente, não sou muito fã deste livro, mas os dois capítulos de swing do livro são ótimos!
C
cecaldas
Cara,
Qdo trabalho com JComboBox, eu crio um modelo para cada ComboBox, que consiste em uma classe que estende de DefaultComboBoxModel. Todos os dados que vão aparecer no seu Jcombox vão estar dentro dela, é a separação da view do model.
No construtor dessa classe eu popularia o ComboBox com objetos usuário, e no java bean de Usuário eu implementaria o método “toString()” para mostrar apenas o login do usuário, e o método “equals(Object o)” para poder fazer comparação entre objetos.
No seu form eu criaria o jcombox, o modelo e setava o modelo no jcombobox mais ou menos assim: teucombo.setModel(teumodelo) na verdade num lembro se eh setModel ou se é setDocument, mas aí eh só testar.
Qdo recuperasse do JcomboBox os objetos viriam objetos usuário populados, aí eé só acessar os atributos desse objeto usuário e setar no campos do form.
JP1
Sim, vc pode fazer isso!
Sim, vc pode fazer isso também!
JP… Swing é meio embaçado mesmo, e difícil de encontrar realmente domina o assunto. Como vc é iniciante, essas suas dúvidas são naturais, no entanto, para vc lidar melhor com estas suas dúvidas, em minha opinião faltou vc procurar conhecer um pouco mais de cada um desses componentes que você citou. Uma vez que você conhece seus métodos e o que eles retornar ou o que eles aceitam como parâmetro, a sua criatividade se encarregaria de trazer para você a solução de seus problemas.
Quando estou trabalhando com swing, confesso, sei pouco, mas eu sempre deixo meu firefox com o seguinte link aberto:
A minha dica pra vc é a seguinte. Quando vc quiser saber se alguma coisa com tal é possível, pesquise sobre ele, e estude apenas ele, e veja se ele serve pra vc! Assim, vc continua tocamdo bém o seu projeto, além de aprender Swing bém!
Não leve essas minhas dicas a mau. Eu programo assim. Penso em componente que seria ideal para o meu problema e aprendo ele, e logo em seguida já aplico no projeto!
Outra referência para aprender swing é o livro do Deitel! Particularmente, não sou muito fã deste livro, mas os dois capítulos de swing do livro são ótimos!
Vou ler os links que você me passou.
Já o combobox, esta funcioanando perfeitamente. Falta apenas a tabela.