Adicionar valores a JList em tempo de execução

10 respostas
R

Oi
eu estou criando um aplicação e vai ter uma JList e vai ler do banco os valores da lista. Bem isso OK pegando com

//conexão ao banco e stm classforname aquelas coisas while(rs.next()){ String 1 = rs.getString(1); System.out.println(1); }
eu quero saber se ao invés de imprimir no console da para colocar na lista String[] dados = {"um","dois","tres"}; JList lista = new JList(dados);
e pegar esses valores e colocar no JList quando eu pedir para abrir essa tela que tem a JList.
Se dá para adicionar em tempo de execução! pode até sumir depois… só preciso no momento para o usuário selecionar o item (é com getSelectedValue()???) e fazer o que eu preciso.
eu achei esse endereço com explicações sobre JList.
Por enquanto obrigado
Ricardo

10 Respostas

Y

Opa,
Adicionei um texto fixo diretamente na action de um jButton, mas acho que com isso você consegue adaptar ao seu código.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    DefaultListModel dlm = new DefaultListModel();
    for(int i = 0; i < jList1.getModel().getSize(); i++) {
        dlm.addElement(jList1.getModel().getElementAt(i));
    }
    dlm.addElement("Texto Inserido");
    jList1.setModel(dlm);
    }

Dessa maneira ele pega o atual conteudo da lista e adiciona no final mais uma linha. Se os dados que a lista já possuia vinham do banco, trate primeiramente a inserção dos dados e depois crie um DefaultListModel com os dados do banco e não com os dados da lista, assim vai garantir que eles estejam atualizados.

[]´s

Daniel

M

De uma olhada:

public class Estudos extends JFrame{
  JList lista;
  JTextField campo;  

  public Estudos() {
    super("A classe JList");
    
    Container c = getContentPane();
    c.setLayout(new FlowLayout(FlowLayout.LEFT));
    
    // Cria um novo DefaultListModel
    DefaultListModel modelo = new DefaultListModel();
    
    // Cria a JList
    lista = new JList();
 
    // Atribui o DefaultListModel à JList
    lista.setModel(modelo);
 
    // Um botão que permite adicionar itens na JList
    JButton btn = new JButton("Adicionar na JList");
    btn.addActionListener(
      new ActionListener(){
        public void actionPerformed(ActionEvent e){
          String valor = campo.getText();
          
          if(valor.length() != 0){
            ((DefaultListModel)(lista.getModel()))
               .addElement(valor);
            campo.setText("");
            campo.requestFocus();
          }
        }
      }
    );

    // Adiciona a lista à janela
    c.add(new JScrollPane(lista));

    // Cria um JTextField e o adiciona à janela
    campo = new JTextField(10);
    c.add(campo);

    // Adiciona o botão à janela
    c.add(btn);  

    setSize(350, 250);
    setVisible(true);
  }
  
  public static void main(String args[]){
    Estudos app = new Estudos();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}
R

Matheus esse código q vc passou tem em
http://www.arquivodecodigos.net/arquivo/visualizar_dica.php?qual_dica=1558
mas valew mesmo assim! ainda não era o que eu queria…

yorgan
deu certo sua ideia… eu tratei o que vem do banco e joguei numa String mas o que eu preciso é saber se no

dlm.addElement("Texto Inserido"); jList1.setModel(dlm); dá para puxar pelo rs.next e ir colocando direto.
Valew!

Ricardo

Y

Sim, se o seu resultset estiver nesse método, basta fazer assim:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {  
     rs = seuResultSet;
     DefaultListModel dlm = new DefaultListModel();   
     while(rs.next()) {
         dlm.addElement("Texto Inserido");  
     }
     jList1.setModel(dlm);  
     }

Nesse novo método ele disconsidera o que já existia na lista e pega somente os registros que estão no banco.
Como o seu novo registro já vai estar lá, dessa maneira deve funcionar corretamente.

[]´s

Daniel

R

yorgan
surgiu um problema... na verdade isso esta para um botão! E eu preciso saber se é possível tb ele criar a lista quando for chamado, assim que abrir. Assim:
Frame A tem um botão que abre outro Frame B, que tem a lista, e quando for aberto pelo botão do Frame A, AUTOMATICAMENTE cria a lista para o usuario. OK?

segue o meu código (do botão que eu criei) para vc ver que esta dando um erro. Ele pega o ultimo registro do banco apenas (não pega tudo). assim:
private void btnPegaActionPerformed(java.awt.event.ActionEvent evt) throws SQLException {//GEN-FIRST:event_btnPegaActionPerformed
    String fam = "";
    DefaultListModel dlm = new DefaultListModel();   
    for(int i = 0; i < lstFamilias.getModel().getSize(); i++) {   
        dlm.addElement(lstFamilias.getModel().getElementAt(i));   
      try{
    Class.forName("com.mysql.jdbc.Driver");
      	 con = DriverManager.getConnection("jdbc:mysql://localhost/dbsgod", "root", "");
       	 stm = con.createStatement();
         rs = stm.executeQuery("select * from familia");
         while(rs.next()){
         fam = rs.getString(4);
         }
    }//fim try
    
    catch(SQLException e){
        con.close();
    }//fim 1 catch
    catch(Exception e){
    }//fim 2 catch
    dlm.addElement(fam);   
    lstFamilias.setModel(dlm);
    }
    }//GEN-LAST:event_btnPegaActionPerformed

isso que eu quero pode ser feito no construtor, antes de tudo?
Valew
Ricardo

7

Chará, vc pode sim passa pro contrutor do outro Frame algum objeto, por exemplo o ResultSet que vc pesquisou e filtrou no primeiro Frame.

public class ListaDinamica extends javax.swing.JFrame {
         
    public ListaDinamica() {
        initComponents();
        try {
            Class.forName("com.mysql.jdbc.Driver");  
            con = DriverManager.getConnection("jdbc:mysql://localhost/dbsgod", "root", "");  
        } catch (Exception ex) {
            System.out.println("Ex : " + ex.getMessage());
        }
        atualizaLista();// Atualiza já quando instacia
    }

    
    Connection con;

    private void atualizaLista() {
        DefaultListModel dlm = new DefaultListModel();
        jList1.setModel(dlm);
        try {
            ResultSet res = con.createStatement().executeQuery("select * from familia");
            while (res.next()) {
                dlm.addElement(res.getString("Nome"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
         atualizaLista();
    }

   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new ListaDinamica().setVisible(true);
            }
        });
    }
    private javax.swing.JButton jButton1;
    private javax.swing.JList jList1;
    private javax.swing.JScrollPane jScrollPane1;
   
}

Ai vc pode chamar atualizaLista() de onde quiser.

e pode passa pra outro Frame o ResultSet que é tratado no metodo atualizaLista();

Y

Só mais uma coisa, de uma olhada em MVC para separar as camadas da sua aplicação. Deixar tudo na view certamente vai dar dor de cabeça depois.

[]´s

Daniel

C

Já foi resolvido este problema?

Se ainda não, talvez posso ajudá-lo.

V

Qual é o problema de fazer:

List&lt;String&gt; lista = new ArrayList&lt;String&gt;(); while(rs.next()){ //Dica: Use o nome do campo, não o índice lista.add(rs.getString("Nome")); }

Para ler mais sobre o List, dá uma olhada nesse tópico:
http://www.guj.com.br/posts/list/74068.java#389435

R

71C4700 Deu certo isso q vc falou. Agora eu chamo o AtualizaLista na hora que ele entra (o metódo da classe pela construtor da classe). Deu OK! Obrigado…

yorgan
Essa está sendo a maior das dores de cabeça (dor de cabeça boa!!!). O cliente QUER DE QUALQUER JEITO MVC e isso está me tomando um tempo maior. Mas vou fazer assim para despois transferir para JSP (trampo futuro, que vai garantir + leite para minhas 3 filhas). Mas mesmo assim obrigado, de novo!

ViniGodoy
Eu pensei em usar isso… até no NetBeans e no Eclipse ele grita por " Expected" que já tava me deixando louco…
Valew tb. Obrigado…

criador
Testei e não deu erro mais (o que queria está OK!) Vc tem outra idéia? Estou aberto para sugestões…

Criado 29 de dezembro de 2008
Ultima resposta 5 de jan. de 2009
Respostas 10
Participantes 6