Listar dados de uma tabela [procurei e não achei]

23 respostas
JP1

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.

Agradeço imensamente quem puder me ajudar.

att,
JP

23 Respostas

W

isso é o problema!

qual e a duvida?

JP1

A duvida consiste em como:

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:

public static void atualizaComboBox(){
           jcbExcluiUsers.removeAllItems();

           String dbURL = "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 * FROM users");

              while (r.next())
                 jcbExcluiUsers.addItem(r.getString("login"));

           } catch (InstantiationException e)
           {
              e.printStackTrace();
           } catch (IllegalAccessException e)
           {
              e.printStackTrace();
           } catch (ClassNotFoundException e)
           {
              e.printStackTrace();
           } catch (SQLException e)
           {
              e.printStackTrace();
           } finally
           {
              try
              {
                 r.close();
                 c.close();
              } catch (SQLException e1)
              {
                 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

Para listar os dados:

Aqui está um Model bem simples de uma tabela que mostra os continentes cadastrados no BD:

package objetos;

import bancodados.Conexao;
import javax.swing.table.AbstractTableModel;
import java.util.Vector;

public class ContinenteTableModel extends AbstractTableModel
{
    //Títulos das colunas.
    static protected String[] columnNames = {"Continente"};
    // Tipos das colunas.
    static protected Class[]  cTypes = {String.class};
    //Array com informações dos continentes.
    protected Continente[] o;
    
    public ContinenteTableModel()
    {
        o = new Continente[0];
    }
    
    public ContinenteTableModel(Conexao con)
    {
        Continente c = new Continente();
        Vector v = new Vector();
        v = c.loadTableModel(con); //Consulta no BD.
        o = new Continente[v.size()];
        v.copyInto(o);
    }

    public void addValue(Continente pJ)
    {
        int q = o.length;
        Continente[] u = new Continente[q + 1];

        for(int r = 0; r < q; r++)
        {
            u[r] = o[r];
        }

        u[u.length - 1] = pJ;
        o = new Continente[u.length];
        o = u;
    }

    public void deleteValue(Continente pJ)
    {
        int q = o.length;
        Continente[] u = new Continente[q - 1];

        boolean s = false;
        for(int r = 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 = new Continente[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
     *
     */
    public int getColumnCount()
    {
        return columnNames.length;
    }

    public String getColumnName(int column) 
    {
        return columnNames[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
     *
     */
    public int getRowCount()
    {
        return o.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
     *
     */
    public Object getValueAt(int rowIndex, int columnIndex)
    {
        if(rowIndex < o.length)
        {
            switch (columnIndex)
            {
		//-1 - para quando eu quiser buscar o Registro inteiro.
                case -1:
                    return o[rowIndex];
                case 0:
                    return new String(o[rowIndex].getContinente());
                default:
                    return null;
            }
        }
        else
            return null;
    }

    public Class getColumnClass(int c)
    {
        return cTypes[c];
    }

    /*
     * Don't need to implement this method unless your table's
     * data can change.
     */
    public void setValueAt(Object value, int row, int col)
    {
        if(row < o.length)
        {
            switch (col)
            {
                case 0:
                    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:

package objetos;

import bancodados.Conexao;
import bancodados.BDContinente;
import java.util.*;

public class Continente
{
    private int codContinente;
    private String continente, erro;
    private boolean excessao;

    public Continente()
    {
        codContinente = 0;
        continente = "";
        erro = "";
        excessao = false;
    }

    public Continente(Continente c)
    {
        codContinente = c.getCodContinente();
        continente = c.getContinente();
        erro = c.getErro();
        excessao = c.getExcessao();
    }

    public void setCodContinente(int codigo)
    {
        try
        {
            codContinente = codigo;
        }
        catch(Exception e)
        {
            codContinente = 0;
        }
    }

    public void setContinente(String nome)
    {
        try
        {
            continente = nome;
        }
        catch(Exception e)
        {
            continente = "";
        }
    }

    public void setErro(String s)
    {
        try
        {
            erro += s.trim() + " ";
        }
        catch(Exception e)
        {
            erro = "";
        }
    }

    public void setExcessao(boolean b)
    {
        try
        {
            excessao = b;
        }
        catch(Exception e)
        {
            excessao = false;
        }
    }

    public void limpaErro()
    {
        try
        {
            erro = "";
        }
        catch(Exception e)
        {
            erro = "";
        }
    }

    public int getCodContinente()
    {
        try
        {
            return codContinente;
        }
        catch(Exception e)
        {
            return 0;
        }
    }

    public String getContinente()
    {
        try
        {
            return continente;
        }
        catch(Exception e)
        {
            return "";
        }
    }

    public String getErro()
    {
        try
        {
            return erro;
        }
        catch(Exception e)
        {
            return "";
        }
    }

    public boolean getExcessao()
    {
        try
        {
            return excessao;
        }
        catch(Exception e)
        {
            return false;
        }
    }

    public Vector loadTableModel(Conexao con)
    {
        Vector retorno = new Vector();

        try
        {
            BDContinente bdC = new BDContinente();

            retorno = bdC.loadTableModel(con);
        }
        catch (Exception e)
        {
        }
        return retorno;        
    }
}

A classe a seguir é onde eu defino as consultas no BD:

package bancodados;


import objetos.Continente;
import objetos.ValidaData;
import java.sql.*;
import java.util.*;

public class BDContinente
{
    public Vector loadTableModel(Conexao con)
    {
        Continente c;
        Vector tabela = new Vector(1, 10);

        try
        {
            Statement statement = con.connect.createStatement();

            String query = "SELECT * FROM Continente ORDER BY Continente ASC";

            ResultSet rs = statement.executeQuery(query);

            try
            {
                while (rs.next())
                {
                    c = new Continente();
                    c.setCodContinente(rs.getInt("CodContinente"));
                    c.setContinente(rs.getString("Continente"));

                    tabela.addElement(c);
                }
            }
            catch(SQLException sqlex)
            {
                sqlex.printStackTrace();
            }

            statement.close();
        }
        catch(SQLException sqlex)
        {
            sqlex.printStackTrace();
        }
        tabela.trimToSize();

        return tabela;
    }
}

Você deve criar uma instância de Conexao para se conectar ao BD (já deixei configurado para o seu BD):

package bancodados;

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;

public class Conexao
{
   public Conexao()
   {
      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(ClassNotFoundException cnfex)
      {
         cnfex.printStackTrace();
         conexao = false;
         status = "Conexão com banco de dados desativado.";
      }
      catch(Exception ex)
      {
         ex.printStackTrace();
         status = "Conexão com banco de dados desativado.";
      }
   }

   public void disconnect()
   {
       try
       {
           connect.close();
       }
       catch(Exception e)
       {
       }
   }

   public Connection getConexao()
   {
       return connect;
   }

   public String getStatus()
   {
      return status;
   }

   protected String url;
   protected String status;
   protected boolean conexao;
   protected Connection connect;
}

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...

//variáveis necessárias na classe GUI (Interface gráfica)
//Cria conexao com o BD;
private Conexao conexao = new Conexao();
private ContinenteTableModel cTM;

...e no construtor desta mesma classe faça como no código a seguir:

//conexao - instância da classe Conexao.
               cTM = new ContinenteTableModel(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 Jcombobox
    private void Teste(java.awt.event.InputMethodEvent evt) {
        // Recebe o valor do combobox
        String x = (String) fieldEstagio.getSelectedItem();
        
        // Faz uma pesquisa na base de dados de acordo com a String
        filedNome.setText(Faz que ele receba a pesquisa);
        fildLogin.setText(mesma coisa do item de cima);
    }

Valeus,

Paulo

JP1

pauloperes:
JP@,

Ja tentou fazer desta forma:

// Cria um evento para o Jcombobox
    private void Teste(java.awt.event.InputMethodEvent evt) {
        // Recebe o valor do combobox
        String x = (String) fieldEstagio.getSelectedItem();
        
        // Faz uma pesquisa na base de dados de acordo com a String
        filedNome.setText(Faz que ele receba a pesquisa);
        fildLogin.setText(mesma coisa do item de cima);
    }

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 Jcombobox
    private void Teste(java.awt.event.InputMethodEvent evt) {
        // Recebe o valor do combobox
        String x = (String) fieldEstagio.getSelectedItem();
        
        // Faz uma pesquisa na base de dados de acordo com a String
        filedNome.setText(Faz que ele receba a pesquisa);
        fildLogin.setText(mesma coisa do item de cima);
    }

Valeus,

Paulo

Paulo eu tentei mas nao deu certo.

Olha o q eu fiz...

esse método preenche o combobox:
public static void atualizaComboBox(){
           jcbExcluiUsers.removeAllItems();

           String dbURL = "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 * FROM users");

              while (r.next())
                 jcbExcluiUsers.addItem(r.getString("login"));

           } catch (InstantiationException e)
           {
              e.printStackTrace();
           } catch (IllegalAccessException e)
           {
              e.printStackTrace();
           } catch (ClassNotFoundException e)
           {
              e.printStackTrace();
           } catch (SQLException e)
           {
              e.printStackTrace();
           } finally
           {
              try
              {
                 r.close();
                 c.close();
              } catch (SQLException e1)
              {
                 e1.printStackTrace();
              }
           }
    }

Este é para pegar o item selecionado e preenchers dos campos da tela.

public void ExcluiUsuario(){
        String escolhido = (String) jcbExcluiUsers.getSelectedItem();
        
        String dbURL = "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 * FROM users WHERE login = '" + escolhido+"'");

           while (r.next()){
               jtfExcluiNome.setText(r.getString("nome"));
               jtfExcluiLogin.setText(r.getString("login"));
           }

        } catch (InstantiationException e)
        {
           e.printStackTrace();
        } catch (IllegalAccessException e)
        {
           e.printStackTrace();
        } catch (ClassNotFoundException e)
        {
           e.printStackTrace();
        } catch (SQLException e)
        {
           e.printStackTrace();
        } finally
        {
           try
           {
              r.close();
              c.close();
           } catch (SQLException e1)
           {
              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.

Veja o que eu fiz:

private void MudaItem(java.awt.event.ItemEvent evt) {
        if (jComboBox1.getSelectedItem().equals("Paulo")){
            jTextField1.setText("paulo");
            jTextField2.setText("login paulo");
        } else if(jComboBox1.getSelectedItem().equals("GUJ")){
            jTextField1.setText("Guj");
            jTextField2.setText("login guj");
        } else if (jComboBox1.getSelectedItem().equals("JP")){
            jTextField1.setText("JP");
            jTextField2.setText("login JP");
        }
    }

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:

http://java.sun.com/docs/books/tutorial/uiswing/components/components.html

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!

Outro link muito bom é este:
http://java.sun.com/developer/onlineTraining/GUI/

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

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:

http://java.sun.com/docs/books/tutorial/uiswing/components/components.html

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!

Outro link muito bom é este:
http://java.sun.com/developer/onlineTraining/GUI/

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.

Criado 15 de julho de 2005
Ultima resposta 29 de jul. de 2005
Respostas 23
Participantes 7