Visualizzazione dei risultati da 1 a 10 su 23

Hybrid View

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

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

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

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

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

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

  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
    per cui non è nemmeno supposto che io le debba usare.
    Vabbè ... ok.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    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?
    Il renderer predefinito di JList invoca toString() su ogni elemento del list model. Quindi in Menu basta definire un toString() che restituisce il "menuName". Stop, tutto qui.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    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?
    Non ho capito ... quale è il dubbio? Avrai oggetti di tipo Menu ... il list model conterrà oggetti Menu e puoi prenderli dal list model in qualunque momento (es. l'elemento "selezionato"). Se non usi DefaultListModel parametrizzato con i generics da Java 7, esso fornisce Object ma tu "sai" che sono oggetti Menu. Quindi basta un cast e poi es. getId().

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Nella jlist adesso mi mostra sempre lo stesso menu (l'ultimo inserito credo).
    Il new Menu(); è da fare chiaramente per ogni record. Non devi istanziarlo es. una volta sola prima del classico ciclo while (rs.next()) !

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    codice:
    menuList = new javax.swing.JList(model);
    for (int i=0; i<menuVoices.size(); i++) {
    model.addElement(menuVoices.get(i));
    }
    Questo è ok ma ovviamente è da un'altra parte (dove crei la GUI, immagino).
    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.