Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    Aggiornare il contenuto di una JList dinamicamente

    Ho una JList creata così:

    codice:
            menuList.setModel(new javax.swing.AbstractListModel() {
                public int getSize() { return menuVoices.size(); }
                public Object getElementAt(int i) { return menuVoices.get(i); }
            });
            jScrollPane1.setViewportView(menuList);

    Dove menuVoices è un vettore ottenuto così:

    codice:
        public static Vector fillJListMenu() {
            Vector<String> temp = new Vector<>();
            Statement st = null;
            try {
                st = connection.createStatement();
                ResultSet rs = st.executeQuery(SELECT menuName FROM Menu);
                while (rs.next()) {
                    String voices = rs.getString("menuName");
                    temp.addElement(voices);
                }
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(blabla);
                Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, e);
            } finally {
                if (st != null) {
                    try {
                        st.close();
                    } catch (SQLException ex) {
                        Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            return temp;
        }
    E' da stamattina che ci sbatto la testa ma non ho capito ancora come fare per aggiornare dinamicamente il contenuto della JList subito dopo l'inserimento di un nuovo articolo nel db.
    Attualmente mi mostra il nuovo articolo solo se esco e rientro dalla maschera dove sono.
    Ho letto un sacco di cose ma non riesco ad applicarle al mio caso... un aiuto sarebbe enormemente apprezzato!
    Grazie.
    Ultima modifica di Jamie04; 20-03-2014 a 17:25

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    non ho capito ancora come fare per aggiornare dinamicamente il contenuto della JList subito dopo l'inserimento di un nuovo articolo nel db.
    Per aggiornare un JList innanzitutto è necessario che la implementazione del ListModel sia "mutabile", ovvero offra metodi es. add, insert, ecc.... che permettano di cambiarne il contenuto. E questi metodi devono correttamente aggiornare la struttura dati interna al model e poi notificare la "view" (in generale qualunque ListDataListener registrato) delle modifiche. Tutto qui.

    Si può anche aggiornare un JList andando a sostituire il ListModel con un altro ma è decisamente più "radicale".

    P.S.
    codice:
            menuList.setModel(new javax.swing.AbstractListModel() {
                public int getSize() { return menuVoices.size(); }
                public Object getElementAt(int i) { return menuVoices.get(i); }
            });

    Questa implementazione di ListModel non è "mutabile" nel senso che ho detto poco fa. Se anche tenessi il riferimento menuVoices e facessi degli add, non avresti il risultato voluto .... il list model non "sa" che hai aggiunto dati dall'esterno.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Per aggiornare un JList innanzitutto è necessario che la implementazione del ListModel sia "mutabile", ovvero offra metodi es. add, insert, ecc.... che permettano di cambiarne il contenuto. E questi metodi devono correttamente aggiornare la struttura dati interna al model e poi notificare la "view" (in generale qualunque ListDataListener registrato) delle modifiche. Tutto qui.

    Si può anche aggiornare un JList andando a sostituire il ListModel con un altro ma è decisamente più "radicale".

    P.S.
    codice:
            menuList.setModel(new javax.swing.AbstractListModel() {
                public int getSize() { return menuVoices.size(); }
                public Object getElementAt(int i) { return menuVoices.get(i); }
            });

    Questa implementazione di ListModel non è "mutabile" nel senso che ho detto poco fa. Se anche tenessi il riferimento menuVoices e facessi degli add, non avresti il risultato voluto .... il list model non "sa" che hai aggiunto dati dall'esterno.
    Il problema è che questo codice me l'ha generato NetBeans e non me lo fa modificare se non parzialmente :-/
    Ma dovrei usare quindi DefaultListModel? E poi?
    Grazie.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Il problema è che questo codice me l'ha generato NetBeans e non me lo fa modificare se non parzialmente :-/
    Classiche "rotture" dei GUI editor .... che io personalmente eviterei come la peste .....

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Ma dovrei usare quindi DefaultListModel?
    Sì, se non hai necessità particolari può andare bene. È "mutabile", è basato internamente su un Vector e da Java 7 l'hanno pure reso "generico" (puoi usare i generics).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Classiche "rotture" dei GUI editor .... che io personalmente eviterei come la peste .....
    E tu hai ragione ma onestamente l'idea di fare tutta la grafica a mano mi turbava parecchio, anche perché sono una mezza schiappa. Così ho fatto molto più in fretta. Il risvolto della medaglia è che per cambiare qualcosa devi lanciare imprecazioni in aramaico...
    Comunque, dovrei fare qualcosa del genere:

    codice:
    DefaultListModel model=new DefaultListModel();
        model.addElement(menuVoices);
    JList menuList= new JList(model);
            jScrollPane1.setViewportView(menuList);
    ?

    Il punto è che mi da errore su
    model.addElement(menuVoices);

    dicendo
    package model does not exist

    ma che vuol dire? model è una variabile che ho appena dichiarato che punta a un oggetto DefaultListModel!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Il punto è che mi da errore su
    model.addElement(menuVoices);

    dicendo
    package model does not exist

    ma che vuol dire?
    Beh, non lo so di preciso, potrebbe esserci altro che dà problemi, che so qualcosa a livello di sintassi in un'altra parte.

    Comunque menuVoices cos'é? Un List? Non credo sia appropriato per te. Se hai già un array/collezione con N elementi, devi aggiungerli uno per uno nel DefaultListModel.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Beh, non lo so di preciso, potrebbe esserci altro che dà problemi, che so qualcosa a livello di sintassi in un'altra parte.
    ho capito dov'è l'errore, è che model devo usarlo più avanti, non lì

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Comunque menuVoices cos'é? Un List? Non credo sia appropriato per te. Se hai già un array/collezione con N elementi, devi aggiungerli uno per uno nel DefaultListModel.
    è un vettore

    ho provato a fare così:

    codice:
    menuList = new javax.swing.JList(model);
    for (int i=0; i<menuVoices.size(); i++) {
    model.addElement(menuVoices.get(i));
    }
    jScrollPane1.setViewportView(menuList);
    però non va lo stesso

    EDIT: FUNZIONA!!! Mancava questa istruzione
    model.addElement(menuName.getText());

    da mettere nell'azione del pulsante 'salva' premuto!!!

    Grazie mille!!!
    Ultima modifica di Jamie04; 20-03-2014 a 19:03

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ho un altro dilemma. Ora devo interagire con questa Jlist. Principalmente deve succedere che se clicco su un articolo presente nella jlist mi deve caricare i dati di quell'articolo nella maschera di fianco (gli articoli contenuti in un'altra jlist, il nome in un campo di testo).
    So che gli eventi delle jlist vanno gestiti con un dato metodo ma non so bene come fare.

    Per esempio ho fatto una cosa del genere:

    codice:
    //Gestisco le azioni del pulsante 'Elimina'
        private void bDeleteMenuActionPerformed(java.awt.event.ActionEvent evt) {                                            
            String field = menuName.getText();
            if (field==null || field.isEmpty()) {
                JOptionPane.showMessageDialog(avviso);
            } else {
                model.removeElement(field);
                DBConnection.deleteMenu(field);
                menuName.setText("");
                
            }
        }                                           
    
    //Gestisco le selezioni sulla lista dei menu
        private void menuListValueChanged(javax.swing.event.ListSelectionEvent evt) {                                     
            String field=menuList.getSelectedValue().toString();
            menuName.setText(field);
        }
    Il secondo metodo funziona (per adesso mi mostra solo il nome del menu nel campo menuName) ma se per esempio provo a cliccare sul pulsante di eliminazione (gestito dal primo metodo) ottengo un bel NullPointerException. Se invece inserisco un menu e lo salvo e poi clicco su elimina funziona, il recordo viene eliminato. Al di là di questo mi interessa sapere se la procedura di caricamento dei dati presi dalla jlist nell'altra maschera può essere giusta (cioè, semplicemente estraendo il menuName e mostrandolo nel campo con menuName.setText(field); ). Non ci sono metodi già pronti che estraggono dati dalle jlist e da un db?

    NB: i metodi qui sopra sono ancora molto provvisori e incompleti. Al momento i menu non contengono articoli (devono ancora capire come inserirli associati ai menu).

    Grazie sempre.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ho risolto...almeno credo!
    Il problema stava in
    String field=menuList.getSelectedValue().toString();

    che ho modificato così:
    String field = (String)menuList.getSelectedValue();

    Se devo essere sincera non ho capito molto bene perché ora fuziona ma penso abbia a che fare col fatto che prima invocavo il metodo toString() che probabilmente non restituisce un oggetto?
    Al di là di questo, che ne pensate di questa implementazione?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    String field=menuList.getSelectedValue().toString();

    che ho modificato così:
    String field = (String)menuList.getSelectedValue();
    public Object getSelectedValue()
    [...] Returns null if there is no selection.

    Quindi è chiaro che, generalmente, va testato il valore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.