Adicionar valores a JList em tempo de execução

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

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

De uma olhada:

[code]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);
}
}[/code]

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

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

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:[code] 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

[/code]

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

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();

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

Já foi resolvido este problema?

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

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

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…