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

    [Java+MySql] Estrarre dati da Jlist

    Ciao, ho un po' di dubbi col mio "antico progetto" .
    Ho riempito la mia jlist così:

    codice:
    public static Vector fillJListMenu() {
    
            //creo un vettore temporaneo dove inserire i campi del menu presi dal db
            Vector<String> temp = new Vector<>();
    
            Statement statement = null;
    
            try {
    
                statement = connection.createStatement();
                ResultSet rs = statement.executeQuery("SELECT menuName FROM Menu");
    
                while (rs.next()) {
                    String voices = rs.getString("menuName");
                    temp.addElement(voices);
                    
                }
    
            } (qui cattura delle eccezioni)
            return temp;
        }
    Questo metodo mi ritorna un vettore con l'elenco dei menu.
    Io voglio che sia possibile cliccare su uno degli elementi dell'elenco in modo che vengano 'estratti' anche gli altri dati (ossia, l'id, autogenerato da mysql) per poterlo passare a una query sql per l'inserimento di uno o più elementi in questo menu attualmente selezionato (i due sono legati da una foreign_key che è appunto l'id del menu).
    Questo è il metodo che mi gestisce, per ora, il click su un menu della jlist:

    codice:
        private void menuListValueChanged(javax.swing.event.ListSelectionEvent evt) {                                      
            int index = menuList.getSelectedIndex();
            int size = model.getSize();
            if (index >= 0) { 
                bDeleteMenu.setEnabled(true);
            } else { 
                bDeleteMenu.setEnabled(false);
                }
            String field = (String) menuList.getSelectedValue();
            menuName.setText(field);
            //int menuId=DBConnection.getMenuId(field);
        }
    Ho pensato di recuperare l'idMenu (che nella Jlist non è presente perché è nascosto all'utente!) assegnandolo a una variabile temporanea per poterlo passare alla successiva INSERT del prodotto.
    Quindi ho creato questo metodo:

    codice:
    //Metodo per recuperare l'id del menu dalla selezione
        public static int getMenuId (String field) {
            
            int menuId=0;
            Statement statement = null;
            
            try {
    
                statement = connection.createStatement();
                PreparedStatement ps=connection.prepareStatement("SELECT menuId FROM Menu WHERE (menuName=?)");
                ps.setString(1, field);
                ResultSet executeQuery = ps.executeQuery();
                while (executeQuery.next()) {
                    menuId = executeQuery.getInt(1);
                }
    
            } (solite catture)
            return menuId;
        }
    Funzionare funziona, per ora il menuId che mi restituisce lo stampa solo a video (però lo stampa doppio, come mai?), ma non sono tanto sicura che questo sia il modo giusto per farlo.
    Commenti e/o suggerimenti?
    Grazie!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Non capisco molto la "macchinosità" dietro tutto ciò, comunque, se fossi in te e dovessi gestire una lista di oggetti "complessi" (ovvero più della semplice stringa-etichetta), mi creerei una classe apposita che ricalchi il modello del record tipo (id, descrizione, quant'altro), con un opportuno toString (descrizione) e con una lista (Vector) di tali oggetti andrei a popolare la mia JList
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Sì è un po' macchinoso, lo ammetto tranquillamente.
    Ma quest'altro modo di impostare le cose che mi suggerisci che vantaggi mi porterebbe?
    Gli oggetti che devo gestire hanno una complessità minima: i menu hanno solo la stringa del nome e l'id, i prodotti hanno il prezzo, l'id e la stringa del nome.

  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
    Ma quest'altro modo di impostare le cose che mi suggerisci che vantaggi mi porterebbe?
    Il primo vantaggio è che sarebbe molto più object-oriented della tua soluzione iniziale. Questo già da solo vale il gioco. Se crei una classe che modella i dati di un menù con testo e id, innanzitutto non devi fare query secondarie, come hai fatto in getMenuId (che tra l'altro è dubbio, perché il menuName potrebbe non essere "unico", oltretutto) e sarebbe anche facilmente espandibile se vuoi aggiungere altri attributi di un menù.

    La visualizzazione in JList sarebbe anche banale se la tua classe es. Menu ha un toString() che fornisce il solo testo da mostrare. Il renderer predefinito di List si basa appunto sul toString(). E tu comunque avresti un singolo oggetto da cui puoi estrarre in qualunque momento i vari attributi.
    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
    Il primo vantaggio è che sarebbe molto più object-oriented della tua soluzione iniziale. Questo già da solo vale il gioco. Se crei una classe che modella i dati di un menù con testo e id, innanzitutto non devi fare query secondarie, come hai fatto in getMenuId (che tra l'altro è dubbio, perché il menuName potrebbe non essere "unico", oltretutto) e sarebbe anche facilmente espandibile se vuoi aggiungere altri attributi di un menù.

    La visualizzazione in JList sarebbe anche banale se la tua classe es. Menu ha un toString() che fornisce il solo testo da mostrare. Il renderer predefinito di List si basa appunto sul toString(). E tu comunque avresti un singolo oggetto da cui puoi estrarre in qualunque momento i vari attributi.
    A dire il vero l'avevo anche fatta la classe che modella il menu, molto semplice coi classici getter, setter e toString(), però a un certo punto non capivo come usarla nel mio contesto e ho visto che riuscivo a fare anche senza e ho lasciato stare. Cioè in particolare non capisco come fare il 'collegamento' fra l'oggetto menu o prodotto e i dati estratti dal db.
    Ma se facessi così a quel punto il metodo fillJlistMenu() non mi servirebbe più o dovrei solo modificarlo? Non dovrei più passare i dati alla jList tramite un Vector?

    Grazie!

    ps. getMenuId non può restituire due menu perché i (nomi dei) menu inseriti sono univoci, avevo già inserito un controllo in fase d'inserimento per questo.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da Andrea1979 Visualizza il messaggio
    Non capisco molto la "macchinosità" dietro tutto ciò, comunque, se fossi in te e dovessi gestire una lista di oggetti "complessi" (ovvero più della semplice stringa-etichetta), mi creerei una classe apposita che ricalchi il modello del record tipo (id, descrizione, quant'altro), con un opportuno toString (descrizione) e con una lista (Vector) di tali oggetti andrei a popolare la mia JList
    A parte quello che ho detto ad Andbin, il mio problema è che l'id del menu (che è auto generato da Mysql, quindi nel costruttore della classe Menu l'id come dovrei inizializzarlo?) nella Jlist non deve essere visibile, se faccio come dici tu creando un vettore di oggetti Menu e passandolo alla Jlist mi farà vedere anche l'id no?

  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
    Ma se facessi così a quel punto il metodo fillJlistMenu() non mi servirebbe più o dovrei solo modificarlo?
    Servirebbe ancora, ovviamente (li devi estrarre questi menù da qualche parte, no). Io però non lo chiamerei fillJlistMenu, perché con JList non ha nulla direttamente a che fare. E non userei Vector ma List (a meno che ci siano ragioni ben valide).

    Insomma, qualcosa del tipo:

    public List<Menu> findAllMenus()

    (Menu, classe specifica per modellare una voce di menù)

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    perché i (nomi dei) menu inseriti sono univoci
    Allora ok!
    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
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Servirebbe ancora, ovviamente (li devi estrarre questi menù da qualche parte, no). Io però non lo chiamerei fillJlistMenu, perché con JList non ha nulla direttamente a che fare. E non userei Vector ma List (a meno che ci siano ragioni ben valide).
    Perché non usare Vector?
    Non ho nessuna dimestichezza con le liste :-|
    Comunque continuando il discorso coi vettori, se creo un vettore di oggetti menu per riempirlo con i dati presi dal db come devo fare?
    Perché se faccio:
    temp.addElement(rs.getString("menuName"));
    dove temp è un vector di Menu, mi dice che non può convertire una stringa in menu :-|

    edit: questo l'ho risolto così:
    temp.addElement((Menu)rs.getObject("menuName"));
    ri-edit: no, mi da errore a run-time
    java.lang.String cannot be cast to Menu
    Ultima modifica di Jamie04; 09-04-2014 a 12:00

  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
    Perché non usare Vector?
    Non ho nessuna dimestichezza con le liste :-|
    Innanzitutto Vector a partire da Java 1.2 implementa List ... quindi di fatto è una "lista". Comunque Vector è la "vecchia" collezione legacy, che oltretutto è synchronized e non sempre serve una collezione che sia tale perché magari, ad esempio, è sempre acceduta nel contesto dello stesso thread.

    Infine se usi Vector (ma anche es. ArrayList) stai codificando verso una implementazione, mentre invece (sempre se non ci sono ragioni ben valide) sarebbe meglio codificare verso una astrazione, ovvero nel caso delle collezioni verso una interfaccia come List.
    In questo modo hai più flessibilità nel cambiare in futuro il tipo di collezione che viene realmente istanziato e restituito dal metodo. All'inizio il "findAllMenus" potrebbe creare un ArrayList ma se in futuro volessi passare a LinkedList puoi farlo, senza che il resto all'esterno debba cambiare. Se volessi un giorno restituire un List "immutabile" puoi farlo, grazie a Collections.unmodifiableList.
    Insomma, hai più possibilità di cambiare .... mentre se usi Vector hai abbastanza le mani legate o comunque diventa più complicato poter cambiare "idea".

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Comunque continuando il discorso coi vettori, se creo un vettore di oggetti menu per riempirlo con i dati presi dal db come devo fare?
    Perché se faccio:
    temp.addElement(rs.getString("menuName"));

    dove temp è un vector di Menu, mi dice che non può convertire una stringa in menu :-|
    Ovviamente così no.

    Invece es.:
    codice:
    Menu menu = new Menu();
    menu.setName(rs.getString("menuName"));
    menu.setXXXX(rs.getYYYY("xxxxxx"));
    .....
    lista.add(menu);
    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
    Quote Originariamente inviata da andbin Visualizza il messaggio
    All'inizio il "findAllMenus" potrebbe creare un ArrayList ma se in futuro volessi passare a LinkedList puoi farlo, senza che il resto all'esterno debba cambiare. Se volessi un giorno restituire un List "immutabile" puoi farlo, grazie a Collections.unmodifiableList.
    Insomma, hai più possibilità di cambiare .... mentre se usi Vector hai abbastanza le mani legate o comunque diventa più complicato poter cambiare "idea".
    Sì avevo letto che Vector è obsoleta, però guarda, in questo corso non ci hanno mai parlato delle liste, per cui non è nemmeno supposto che io le debba usare. Vector per i miei scopi va bene.

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Invece es.:
    codice:
    Menu menu = new Menu();
    menu.setName(rs.getString("menuName"));
    menu.setXXXX(rs.getYYYY("xxxxxx"));
    .....
    lista.add(menu);
    Ok, supponendo che continuo a usare il vettore (quindi sarà vettore.add(menu)), come posso risolvere il fatto che l'id del menu non deve venir mostrato nella jlist? Se evito di aggiungerlo al vettore poi però non posso recuperarlo in seguito senza fare tutta la manfrina che ho postato all'inizio, o mi sbaglio?
    Grazie infinite.


    Edit: ora però ho un altro problema. Nella jlist adesso mi mostra sempre lo stesso menu, l'ultimo inserito, ripetutamente (per un numero di volte pari alla dimensione del vector). Questo era il codice che riempie la jlist:
    codice:
    menuList = new javax.swing.JList(model);
    for (int i=0; i<menuVoices.size(); i++) {
    model.addElement(menuVoices.get(i));
    }
    dove menuVoices è il vettore dei menu creato col metodo fillJlistMenu di cui sopra.

    ri-edit: ho risolto, perché l'istruzione Menu menu=new Menu(); doveva stare all'interno del ciclo while, io l'avevo messa fuori e così praticamente lavorava sempre sullo stesso oggetto. E, tra l'altro, ho notato che il menuId non viene comunque mostrato nella jlist.
    Il costruttore di menu non l'ho creato. Dovrei farlo secondo voi? Non saprei come inizializzare l'oggetto menu.
    Ultima modifica di Jamie04; 09-04-2014 a 12:42

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.