Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23

Hybrid View

  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
    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?

  4. #4
    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.

  5. #5
    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

  6. #6
    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.

  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
    Registrato dal
    Sep 2012
    Messaggi
    442
    Sì nel frattempo avevo risolto anche quello :-)
    Ora non riesco a far funzionare bene il metodo per eliminare un menu.
    Ecco:

    codice:
    public static int deleteMenu(Menu selectedMenu) {
    
            int result = 0;
    
            PreparedStatement statement = null;
    
            //verifico che il campo non sia vuoto
            try {
                if (selectedMenu == null) {
                    JOptionPane.showMessageDialog(warning);
                    return result;
                }
                //elimino il menu dal database
                statement = connection.prepareStatement("DELETE FROM Menu WHERE menuName=?");
                statement.setString(1, selectedMenu);
                result = statement.executeUpdate();
                
            } //catturo le eccezioni e chiudo lo statement per liberare risorse
            return result;
        }
    Ottengo errore in statement.setString(1, selectedMenu); sempre il solito di incompatible type.
    Ora io credo che allo statement devo passargli per forza una stringa, ma come faccio se il metodo prende un oggetto menu in input (come penso sia giusto che deve essere)?
    Infatti l'oggetto menu gli viene passato dal metodo che gestisce l'azioen del pulsante Elimina:

    codice:
        private void bDeleteMenuActionPerformed(java.awt.event.ActionEvent evt) {                                            
            
            Menu selectedMenu = (Menu)menuList.getSelectedValue();
            selectedMenu.getMenuName();
            int index = menuList.getSelectedIndex();
            DBConnection.deleteMenu(selectedMenu);
            int size = model.getSize();
            if (size == 0) { //Non sono rimasti menu nella lista, disabilito Elimina Menu
                bDeleteMenu.setEnabled(false);
            } else { 
                if (index == model.getSize()) {
                    //rimuovo l'elemento nell'ultima posizione
                    index--;
                }
                menuList.setSelectedIndex(index);
                menuList.ensureIndexIsVisible(index);
            }
            model.removeElement(selectedMenu);
            menuName.setText("");
        }
    Se ci sono altre strade per fare questa cosa, sono aperta a suggerimenti!
    Io l'avevo pensata così: l'utente deve poter eliminare il menu che ha selezionato dalla jlist. Per cui se un menu è effettivamente selezionato il pulsante Elimina si abilita e schiacciandolo deve essere passato al metodo che cancella dal database il menu il nome del menu da eliminare (essendo sicuramente univoco). Ora come avevo fatto prima funzionava, ma ovviaemnte dopo le modifiche non va più, e sto cercando di adattarlo alla nuova versione.

  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
    Ottengo errore in statement.setString(1, selectedMenu); sempre il solito di incompatible type.
    Ora io credo che allo statement devo passargli per forza una stringa, ma come faccio se il metodo prende un oggetto menu in input (come penso sia giusto che deve essere)?
    Scusa ma mi pare evidente .... stai passando alla query un oggetto Menu .... che gli serve? Secondo te come "saprebbe" e potrebbe usarlo?

    Semplicemente: selectedMenu.getMenuName() (o getName() ... non so come l'hai chiamato), visto che alla query serve il menuName ... e non il "menu" oggetto.
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.