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

    Metodo che non fa quello che dovrebbe

    Scusate per il titolo criptico ma non sapevo proprio come sintetizzare.
    Mi aiutate a capire perché questo metodo non si comporta come vorrei?
    In pratica io devo creare una serie di tabbedpane per ogni menu esistente e in ogni tab c'è la lista prodotti del menu corrispondente. Purtroppo così com'è mi vi visualizza soltanto l'ultima lista prodotti, quella alfabeticamente più in alto. Negli altri tab ci sono i menu ma sono vuoti, ovvero non compare nessuna jlist.
    Non è un problema di "riempimento" del vettore del model della lista prodotti, perché stampandoli a video li vedo tutti.
    Grazie.

    codice:
            for (int i = 0; i < menuLista.size(); i++) {
                int menuId = menuLista.get(i).getMenuId();
                // estraggo dal DB la lista di prodotti appartenenti al menu passatogli come parametro
                // con il ciclo for inserisco nel modello di default della JList prodotti
                prodottiLista.clear();
                modelProductList.clear(); // svuoto la lista dei prodotti.
                prodottiLista = DBManager.fillProductList(menuId);
    
                for (int b = 0; b < prodottiLista.size(); b++) {
                    modelProductList.addElement((Product) prodottiLista.get(b));
                }
    
                jProductList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                jProductList.addListSelectionListener(new ListSelectionListener() {
                    @Override
                    public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                        jProductListValueChanged(evt);
                    }
                });
                jScrollPane3.setViewportView(jProductList);
                JPanel pL = new JPanel();
                pL.add(jScrollPane3);
                // panelList.add(pL);
                jTabbedPane1.addTab(menuLista.get(i).getMenuName(), pL);
    
            }
    Ultima modifica di Jamie04; 22-05-2014 a 18:34

  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
    Negli altri tab ci sono i menu ma sono vuoti.
    Non è un problema di "riempimento" del vettore del model della lista prodotti, perché stampandoli a video li vedo tutti.
    All'interno del ciclo, prodottiLista lo ottieni da DB e modelProductList lo riempi con gli stessi Product da prodottiLista (perché questo riversamento?).
    Ma il punto è che questi Product non li stai "usando" per qualcosa nel ciclo. Li userai presumo in un secondo momento.
    Ma una volta che è finito il ciclo, prodottiLista conterrà l'ultima lista presa da DB e modelProductList questi stessi ultimi dati. E quando li userai ... ovvio che hai solo gli ultimi.


    P.S. cerca di chiarirti le idee su classi, istanze e reference .... altrimenti non so quanto vai "lontano" .....
    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
    Non è un metodo che ho fatto io
    Questi product poi si dovrà selezionarli per aggiungerli a una jtable.
    Ma come risolvo?
    Ah ho scritto metodo...per distrazione :-)

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ho modificato il metodo in questo modo:

    codice:
    for (int i = 0; i < menuLista.size(); i++) {
                int menuId = menuLista.get(i).getMenuId();
                modelProductList.clear(); // ricarico la lista dei prodotti.
                prodottiLista = DBManager.fillProductList(menuId);
                for (int b = 0; b < prodottiLista.size(); b++) {
                    modelProductList.addElement((Product) prodottiLista.get(b));
                }
                JScrollPane scrollPane = new JScrollPane(jProductList);
                jTabbedPane1.addTab(menuLista.get(i).getMenuName(), scrollPane);
                System.out.println(modelProductList);
            }
    Purtroppo ottengo sempre lo stesso risultato. La jlist prodotti è mostrata solo nell'ultimo tabbedpane.
    Ho aggiunto l'istruzione:
    System.out.println(modelProductList);
    per vedere cosa c'e' nel model e i prodotti me li stampa tutti correttamente, non solo quelli dell'ultima lista.

    Ma se metto la stessa istruzione fuori dal ciclo effettivamente mi stampa solo quelil dell'ultima lista, quindi è come dicevi tu.

    EDIT: NO, non è così perché se tolgo l'istruzione modelProductList.clear(); mi stampa anche fuori dal ciclo tutti i prodotti (e nella schermata li vedo tutti ma sempre tutti inseriti nell'ultimo tabbedpane)!!
    Quidi non è un fatto di dati, i dati ci sono tutti nel model, è che non vengono visualizzati correttamente.

    Ma non ho capito come risolvere e sto finendo il tempooo (
    Ultima modifica di Jamie04; 23-05-2014 a 13:41

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Per quanto posso capire (ovviamente non conoscendo tutto il tuo contesto di lavoro), per ogni menuId che prendi da menuLista.get(i), allora dovresti avere:

    - un nuovo List<Product> (lo ottieni, deduco, da DBManager.fillProductList).
    - un nuovo XyzListModel (non so cosa hai usato di preciso) che ovviamente riempi con gli N Product.
    - un nuovo JList (questo concetto di "nuovo" del JList non lo vedo nel tuo codice!)
    - un nuovo JScrollPane (questo sì, lo fai già, da quanto vedo).
    - un nuovo tab (questo giustamente lo fai con jTabbedPane1.addTab).

    Ti è chiaro che dovresti avere tutti oggetti "nuovi" e ben distinti tra i vari tab?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Per quanto posso capire (ovviamente non conoscendo tutto il tuo contesto di lavoro), per ogni menuId che prendi da menuLista.get(i), allora dovresti avere:

    - un nuovo List<Product> (lo ottieni, deduco, da DBManager.fillProductList).



    - un nuovo XyzListModel (non so cosa hai usato di preciso) che ovviamente riempi con gli N Product.
    ho usato DefaultListModel
    quindi ci vuole un diverso DefaultListModel per ogni jlist?

    - un nuovo JList (questo concetto di "nuovo" del JList non lo vedo nel tuo codice!)
    ok, infatti non c'e', è un'unica jlist
    posso creare un arraylist di jlist? cioè come dovrei fare per creare una nuova jlist?


    Edit: ok ho risolto così:

    codice:
    for (int i = 0; i < menuLista.size(); i++) {
                int menuId = menuLista.get(i).getMenuId();
                DefaultListModel modelProductList = new DefaultListModel();
                JList jProductList = new JList(modelProductList);
                // estraggo dal DB la lista di prodotti appartenenti al menu passatogli come parametro
                // con il ciclo for inserisco nel modello di default della JList prodotti
                //prodottiLista.clear();
                modelProductList.clear(); // ricarico la lista dei prodotti.
                prodottiLista = DBManager.fillProductList(menuId);
                for (int b = 0; b < prodottiLista.size(); b++) {
                    modelProductList.addElement((Product) prodottiLista.get(b));
                }
                JScrollPane scrollPane = new JScrollPane(jProductList);
                jTabbedPane1.addTab(menuLista.get(i).getMenuName(), scrollPane);
                jProductList.addListSelectionListener(new ListSelectionListener() {
                    @Override
                    public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                        jProductListValueChanged(evt);
                    }
                });
                jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                jProductList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            }
    Mi stavo complicando la vita inutilmente...non serviva nessun array!

    Grazie!
    Ultima modifica di Jamie04; 23-05-2014 a 15:53

  7. #7
    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
    ho usato DefaultListModel
    quindi ci vuole un diverso DefaultListModel per ogni jlist?

    ok, infatti non c'e', è un'unica jlist
    posso creare un arraylist di jlist? cioè come dovrei fare per creare una nuova jlist?
    Devi avere tutto separato. Vuoi creare un arraylist di jlist? Certo che si può fare ma .... poi ti serve successivamente andare a prendere il JList i-esimo? (stessa cosa che ti dicevo nell'altra discussione).

    Se ti basta solo agganciare ogni cosa al proprio "contenitore" (listmodel nel list, il list nel scrollpane, il scrollpane nel tab), no non ti serve un arraylist.

    Grosso modo (abbozzato .... vedi il concetto, non tanto il codice!):

    codice:
    for (int i = 0; i < menuLista.size(); i++) {
        int menuId = .........
    
        // *nuova* lista Product
        List<Product> prodottiLista = DBManager.fillProductList(menuId);
    
        // *nuovo* list model
        DefaultListModel listModel = new DefaultListModel();
    
        // ....itera su prodottiLista e riempi listModel .....
    
        // *nuovo* JList
        JList jlist = new JList(listModel);
    
        // *nuovo* JScrollPane
        JScrollPane scrollPane = new JScrollPane(jlist);
    
        // aggiunge *nuovo* tab
        jTabbedPane1.addTab( ..... , scrollPane);
    
        // ......
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Non hai visto il mio editing? Ho risolto :-)

  9. #9
    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 hai visto il mio editing? Ho risolto :-)
    No, non l'avevo visto. Lo vedo solo ora.

    Comunque stai ancora facendo modelProductList.clear() che ora è inutile (il DefaultListModel è "nuovo"!).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ok, vero! Ho un piccolo "problemino" se clicco su un prodotto questo viene aggiunto correttamente alla jtable laterale però la prima riga resta sempre vuota. Questo è il codice che genera la jtable in questione:

    codice:
            jTable1 = new JTable();
            jTable1.setModel(new DefaultTableModel(
                    new Object[][]{{},},
                    new String[]{"Prodotto", "Prezzo", "Quantità"}
            ) {
                Class[] types = new Class[]{
                    java.lang.String.class, java.lang.Float.class, java.lang.Integer.class,  
                };
    
                @Override
                public Class getColumnClass(int columnIndex) {
                    return types[columnIndex];
                }
            });
            jTable1.setRequestFocusEnabled(false);
            jTable1.setSelectionBackground(new Color(255, 204, 204));
            jTable1.setSelectionForeground(new Color(51, 51, 51));

    e questo è il codice che gestisce il click sulla lista prodotti che aggiunge la riga alla jtable:

    codice:
        private void jProductListValueChanged(ListSelectionEvent evt) {
            if (evt.getValueIsAdjusting()) {
                return;
            }
            JList jProductList = (JList) evt.getSource();
            int index = jProductList.getSelectedIndex();
            if (index >= 0) {
                Product selectedProduct = (Product) jProductList.getSelectedValue();
                int currentProduct = selectedProduct.getProductId();
                productName = selectedProduct.getProductName(); // da inserire nella jTable
                productPrice = selectedProduct.getProductPrice(); // da inserire nella jTable
                ((DefaultTableModel) jTable1.getModel()).addRow(new Object[]{productName, productPrice, 1});
            }
        }
    Ultima modifica di Jamie04; 23-05-2014 a 16:22

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.