Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    E' possibile linkare due jlist?

    Ciao, sto impazzendo su come gestire al meglio questa cosa ma finora ho elaborato soluzioni che pur se funzionano sono molto "deboli" infatti non appena succede qualcosa di diverso ecco che spunta fuori un problema.
    Quello che devo fare non è niente di trascendente, però...
    Io ho due jlist entrambe che prendono i dati da un vector riempito con dati presi da un db mysql.
    Nella jlist principale deve esserci la categoria da selezionare, in base a cosa si seleziona nella categoria devono comparire gli articoli che sono in quella categoria nella seconda jlist. E fin qui avrei anche fatto.
    Il problema è che non devo solo visualizzare i dati ma anche farci delle operazioni di inserimento e modifica dati e qui sorgono i problemi.
    1) Per esempio se modifico il nome di una categoria sono costretta a ricaricare la jlist delle categorie ma in questo modo se voglio continuare ad esempio ad aggiungere articoli in quella categoria ho il solito NPE perché ho ovviamente perso la selezione. Potrei salvarmi l'indice della categoria selezionata prima della modifica e passarlo al metodo che inserisce il prodotto ma anche questa soluzione non va bene perché l'inserimento del prodotto si fa anche su una nuova categoria e su una categoria già esistente e perciò in quelle situazioni finirei col passargli l'indice sbagliato, certo potrei mettere una serie di if e cercare di capire se l'inserimento del prodotto si sta facendo su una categoria modificata, esistente o nuova...ma già così ce ne sono troppi e ho paura che diventi troppo incasinata la faccenda!
    2) Ho un pulsante di ricerca articoli che se trova un match con la ricerca me lo mostra nella jlist degli articoli ma io vorrei anche che oltre a mostrarmi l'articolo trovato mi punti l'indice della jlist della categoria a quella cui appartiene e questo secondo punto non so farlo.
    In pratica io vorrei che ci fosse una sorta di collegamento fra le due jlist, in modo che menuList (categorie) "sappia" cosa sta "facendo" productList (articoli).... non so se mi sono spiegata...
    Mi è stato suggerito di aggiungere un ListSelectionListener a menuList e fare in modo che il gestore imposti il model di productList per visualizzare i dettagli della riga selezionata...ma sinceramente non ho ben capito come implementare questa cosa!

    Sono disponibile anche a cambiare implementazione se le jlist fossero scomode per fare queste cose... cioè alla fine non è che devo fare chissà che, è soltanto una form di inserimento e modifica di pochi dati in un db...l'unica "difficoltà" è questa suddivisione in categorie che mi porta molti problemi e il fatto che ho voluto fare una form molto intuitiva per l'utente (e di solito facile per l'utente significa difficile per il povero programmatore )
    Avete qualche suggerimento da darmi?
    Grazie tante!

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ho visto che in netbeans c'è una funzione di Binding, qualcuno mi può spiegare a grandi linee come funziona e se può fare al caso mio?

  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
    Ho visto che in netbeans c'è una funzione di Binding, qualcuno mi può spiegare a grandi linee come funziona e se può fare al caso mio?
    Non uso normalmente NetBeans quindi non so dire ora in questo momento cosa è quella "funzione di Binding". Mi verrebbe da pensare che è una funzionalità che permette di agganciare i componenti grafici ad una base dati ma questo vorrebbe dire che ci deve essere un framework (offerto da NetBeans) per questo o comunque la generazione di un po' di codice opportuno per quella gestione.

    Non ho risposto prima alla tua domanda perché il mio problema principale quando rispondo sui forum non è tanto dare la risposta in sé spiegando e descrivendo le questioni tecniche (perché credo di intendermene abbastanza ) ma capire bene il contesto e quello che vuole fare l'utente ... (che è più difficile )

    Vediamo di riassumere. Quando parli di "linkare due jlist" a me viene da pensare questo (esempio pratico per capirci):
    quando selezioni il valore X della jlist1, devono comparire i valori es. A B C nella jlist2 (che sono legati al valore X), quando selezioni il valore Y della jlist1, devono comparire i valori es. D E F nella jlist2 (che sono legati al valore Y).
    Detto in generale, una gestione in "cascata" delle JList, dove i valori della seconda dipendono dalla selezione nella prima. È così?
    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
    Non uso normalmente NetBeans quindi non so dire ora in questo momento cosa è quella "funzione di Binding". Mi verrebbe da pensare che è una funzionalità che permette di agganciare i componenti grafici ad una base dati ma questo vorrebbe dire che ci deve essere un framework (offerto da NetBeans) per questo o comunque la generazione di un po' di codice opportuno per quella gestione.
    Non so se debba esserci un framework (ma a me sembra di no), di sicuro genera un po' di codice.
    Credo che non serva solo ad agganciare i componenti grafici a una base di dati, ma in generale a "legare" vari componenti evitando di dover scrivere un sacco di listener e gestori di azioni. Questo è quello che ho capito a grandi linee. Ho fatto una prova veloce con una jlist e un campo di testo, ho legato il campo di testo alla jlist con la binding expression ${selectedElement}, così facendo quando clicco su un elemento della jlist mi mostra nel jtextfield l'elemento selezionato (roba per la quale io ho sprecato fiumi di codice ). Ovviamente non so come funzioni se deve estrarre più di un dato.

    Non ho risposto prima alla tua domanda perché il mio problema principale quando rispondo sui forum non è tanto dare la risposta in sé spiegando e descrivendo le questioni tecniche (perché credo di intendermene abbastanza ) ma capire bene il contesto e quello che vuole fare l'utente ... (che è più difficile )
    Hai ragione, ma non ti preoccupare proprio, già è troppo quello che fai visto che nessuno ti paga per farlo!

    Vediamo di riassumere. Quando parli di "linkare due jlist" a me viene da pensare questo (esempio pratico per capirci):
    quando selezioni il valore X della jlist1, devono comparire i valori es. A B C nella jlist2 (che sono legati al valore X), quando selezioni il valore Y della jlist1, devono comparire i valori es. D E F nella jlist2 (che sono legati al valore Y).
    Detto in generale, una gestione in "cascata" delle JList, dove i valori della seconda dipendono dalla selezione nella prima. È così?
    Esattamente questo.

  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
    Ho fatto una prova veloce con una jlist e un campo di testo, ho legato il campo di testo alla jlist con la binding expression ${selectedElement}, così facendo quando clicco su un elemento della jlist mi mostra nel jtextfield l'elemento selezionato (roba per la quale io ho sprecato fiumi di codice ).
    Ho fatto una ricerca veloce ed ho trovato subito questo. Da quanto ho capito è l'utilizzo della specifica JSR-295 "Beans Binding". Tra l'altro non ho trovato (ma non ho cercato più di tanto comunque) un documento ufficiale sulla specifica, quindi mi viene da pensare che sia qualcosa di non più tanto portato avanti e/o obsoleto.
    In ogni caso, se si utilizza una implementazione di questa specifica, non è certo presente nel framework standard di Java SE ... devi comunque sicuramente portarti dietro qualcosa insieme all'applicazione.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Esattamente questo.
    Supponendo selezione "singola" (giusto come caso più semplice), il punto fondamentale è la registrazione di un ListSelectionListener. Quando la selezione nella lista1 cambia, prendi il valore selezionato e lo usi in qualche modo per ottenere i dati da mettere nella lista2.
    Il punto critico è come/dove vengono presi i dati per la lista2. Se fossero semplici strutture dati (es. ad ogni elemento della lista1 è associato un array/List con altri dati), sarebbe relativamente semplice "legare" le due liste, eventualmente facendo un po' di "design" sulle classi in modo che sia, magari, abbastanza facilmente riutilizzabile.
    Se si trattasse di accedere ad un DB per prendere i dati, bisognerebbe fare altre valutazioni. Es. come viene usato il valore selezionato? Fa solo da "filtro" in una query ben precisa? O addirittura va a cambiare radicalmente la query?
    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
    Ho fatto una ricerca veloce ed ho trovato subito questo. Da quanto ho capito è l'utilizzo della specifica JSR-295 "Beans Binding". Tra l'altro non ho trovato (ma non ho cercato più di tanto comunque) un documento ufficiale sulla specifica, quindi mi viene da pensare che sia qualcosa di non più tanto portato avanti e/o obsoleto.
    Sì è lo stesso link che stavo leggendo io, ho fatto anche delle prove, ma direi che è meglio scartarlo, anche perché genera un mucchio di codice che non comprendo e mi sembra pure pesantino, ci mette più tempo a caricare la form dove sono abilitate quelle cose.


    Quote Originariamente inviata da andbin Visualizza il messaggio
    Supponendo selezione "singola" (giusto come caso più semplice), il punto fondamentale è la registrazione di un ListSelectionListener. Quando la selezione nella lista1 cambia, prendi il valore selezionato e lo usi in qualche modo per ottenere i dati da mettere nella lista2.
    Il punto critico è come/dove vengono presi i dati per la lista2. Se fossero semplici strutture dati (es. ad ogni elemento della lista1 è associato un array/List con altri dati), sarebbe relativamente semplice "legare" le due liste, eventualmente facendo un po' di "design" sulle classi in modo che sia, magari, abbastanza facilmente riutilizzabile.
    Se si trattasse di accedere ad un DB per prendere i dati, bisognerebbe fare altre valutazioni. Es. come viene usato il valore selezionato? Fa solo da "filtro" in una query ben precisa? O addirittura va a cambiare radicalmente la query?
    La selezione è singola. Guarda ti metto uno screenshot di come è la maschera attualmente che forse vale più di mille parole:
    Untitled-1.jpg
    La jlist a sx è quella delle categorie. Se clicco su una categoria (selezione singola) nella jlist di dx mi compaiono i prodotti di quella categoria.
    I dati nella lista2 (quella dei prodotti) vengono presi da un vector che viene generato a seconda dell'id del menu selezionato nella lista1, quindi ho un metodo che mi ritorna questo vettore a seconda dell'id della categoria che gli passo.
    I dati sono in un db mysql.
    Tanto per chiarire meglio questo è il metodo che chiamo per riempire la jlist2:

    codice:
        private void reloadProductList() {
            modelProductList.clear();
            if (newMenuIsSaved) {
                Vector<Product> productVoices = DBConnection.fillProductList(newMenuId);
                for (int i = 0; i < productVoices.size(); i++) {
                    modelProductList.addElement((Product) productVoices.get(i));
                }
            } else {
                Vector<Product> productVoices = DBConnection.fillProductList(selectedMenuId);
                for (int i = 0; i < productVoices.size(); i++) {
                    modelProductList.addElement((Product) productVoices.get(i));
                }
    
            }
        }
    Non ho capito questa tua domanda:
    "Es. come viene usato il valore selezionato? Fa solo da "filtro" in una query ben precisa? O addirittura va a cambiare radicalmente la query"

  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
    La selezione è singola. Guarda ti metto uno screenshot di come è la maschera attualmente che forse vale più di mille parole:
    Lo screenshot lo vedo .... solo che a prima vista la schermata mi pare un pochino "caotica", nel senso che ci sono svariati pulsanti di cui non è chiaro (almeno per me che non conosco l'uso della applicazione) cosa fanno e su cosa.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    La jlist a sx è quella delle categorie. Se clicco su una categoria (selezione singola) nella jlist di dx mi compaiono i prodotti di quella categoria.
    I dati nella lista2 (quella dei prodotti) vengono presi da un vector che viene generato a seconda dell'id del menu selezionato nella lista1, quindi ho un metodo che mi ritorna questo vettore a seconda dell'id della categoria che gli passo.
    I dati sono in un db mysql.
    E quindi la problematica quale è esattamente? La logica di base è banale: quando in jlist1 cambia la selezione, si prende il valore selezionato e lo si usa per ottenere la lista da visualizzare in jlist2. Tutto qui. E come prendere la lista da visualizzare mi pare di vedere che l'hai già fatto.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    codice:
            if (newMenuIsSaved) {
                Vector<Product> productVoices = DBConnection.fillProductList(newMenuId);
                for (int i = 0; i < productVoices.size(); i++) {
                    modelProductList.addElement((Product) productVoices.get(i));
                }
            } else {
                Vector<Product> productVoices = DBConnection.fillProductList(selectedMenuId);
                for (int i = 0; i < productVoices.size(); i++) {
                    modelProductList.addElement((Product) productVoices.get(i));
                }
            }
    Io però non ho capito il perché del doppio "flusso" in cui cambia solo il parametro a fillProductList.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Non ho capito questa tua domanda:
    "Es. come viene usato il valore selezionato? Fa solo da "filtro" in una query ben precisa? O addirittura va a cambiare radicalmente la query"
    Era solo per dire in generale .... il valore selezionato può essere usato in modi ben differenti a seconda dei casi. Potrebbe essere un semplice filtro nella select es. ..... WHERE campoDiFiltro=valoreselezionato oppure potrebbe causare l'uso di query ben differenti, es. se valore 1 prendi dalla tabella X, se valore 2 prendi dalla tabella Y o ancora altri scenari. Io ovviamente non lo so .....
    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
    Lo screenshot lo vedo .... solo che a prima vista la schermata mi pare un pochino "caotica", nel senso che ci sono svariati pulsanti di cui non è chiaro (almeno per me che non conosco l'uso della applicazione) cosa fanno e su cosa.
    quelli in alto a dx sono per l'inserimento/modifica/eliminazione del menu, quelli più in basso sono relativi ai prodotti.


    Io però non ho capito il perché del doppio "flusso" in cui cambia solo il parametro a fillProductList.
    ho dovuto farlo perché quando si inserisce un nuovo menu non era possibile prendere l'id del menu selezionato dalla jlist1, chiaramente...cioè ho dovuto distinguere fra il caso della normale selezione di un menu esistente e quello di un menu appena inserito.
    Il problema, come ho detto nel post in cui ha avuto inizio la discussione, è che quando modifico un menu (il nome) devo per forza di cose ricaricare la jlist1 (altrimenti continuerei a vedere il vecchio nome finché non chiudo e riapro la finestra), in questo modo perdo dunque la "selezione" e se provo a inserire un prodotto nel menu modificato ottengo un NPE, se invece seleziono un altro menu non ho problemi.
    Inoltre ho il pulsante di ricerca articoli che se trova un match con la ricerca me lo mostra nella jlist degli articoli ma io vorrei anche che oltre a mostrarmi l'articolo trovato mi punti l'indice della jlist1 della categoria a quella cui appartiene e questo secondo punto non so farlo.
    Mi è stato suggerito di aggiungere un ListSelectionListener a menuList e fare in modo che il gestore imposti il model di productList per visualizzare i dettagli della riga selezionata...ma sinceramente non ho ben capito come implementare questa cosa!

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Avrei più o meno risolto il problema 1) (quello dell'NPE in caso di modifica della categoria), semplicemente usando una variabile globale (listIndex) dove "appoggio" l'indice dell'elemento selezionato prima di perdere la selezione, e poi lo ri-fisso dopo il ri-caricamento della lista con:
    menuList.setSelectedIndex(listIndex);
    Ovviamente non va bene in caso voglio modificare un nuovo menu appena dopo averlo inserito, ma tanto è una possibilità che ho tolto, vista la rarità dell'evento.

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.