Informazioni sulle JList

di il
5 risposte

Informazioni sulle JList

Ciao a tutti,

avrei bisogno del vostro aiuto per risolvere un punto morto a cui sono arrivato con un mini progetto.

L'obiettivo è quello di avere una lista con nomi di ristoranti ( creata a seguito di una ricerca per "città" ), in cui, selezionando uno dei vari ristoranti risultati, escano in una seconda facciata le informazioni su quel ristorante: nome, indirizzo, città, numero telefono, ecc.. ( tutte informazioni salvate su un foglio .txt).

ho implementato la prima parte creando un vector a seguito di una ricerca dei ristoranti per città e caricando questo vector all'interno di una Jlist.
Purtroppo non so come, a seguito della selezione di uno dei nomi ristoranti nella JList , far uscire le informazioni su un'altra finestra.
Voi sapreste come fare? avreste seguito un'altra strada?

vi ringrazio per l'attenzione
saluti

5 Risposte

  • Re: Informazioni sulle JList

    affamato ha scritto:


    ho implementato la prima parte creando un vector a seguito di una ricerca dei ristoranti per città e caricando questo vector all'interno di una Jlist.
    Purtroppo non so come, a seguito della selezione di uno dei nomi ristoranti nella JList , far uscire le informazioni su un'altra finestra.
    Voi sapreste come fare? avreste seguito un'altra strada?
    Partiamo da una premessa: in JList ciascuna "voce" che si vede a video è per default semplicemente il risultato del toString() su ciascun oggetto contenuto nel model del JList. A meno di fare cose più sofisticate con i cell renderer (ma servono nozioni/esperienza su Swing).

    Ora, innanzitutto hai creato una classe chiamata Ristorante che "modella" un singolo ristorante ed ha tutti gli attributi necessari es. nome, indirizzo, telefono ecc.. ? Questa è assolutamente la base a livello OOP che ti serve in generale nella applicazione.

    Quindi: se vuoi che nel JList si vedano i nomi dei ristoranti, ci sono due strade:
    a) se puoi/vuoi sfruttare (e "impegnare", per così dire) il toString() di Ristorante per fornire il nome del ristorante, allora basta fare un JList<Ristorante>. JList conterrà tutti oggetti Ristorante. L'elemento selezionato lo ottieni proprio come Ristorante.
    b) se NON puoi/vuoi sfruttare il toString() di Ristorante (perché magari serve per logging/debugging/altro), nessun problema. Si fa un'altra (molto piccola) classe es. RistoranteListItem che "incapsula" un oggetto Ristorante e in cui il toString() lo puoi fare come vuoi, prendendo banalmente solo il nome del ristorante. Poi si fa un JList<RistoranteListItem> . E anche qui dalla voce selezionata si riesce facilmente a ottenere l'oggetto Ristorante (se hai fatto RistoranteListItem sensatamente).

    Poi per passarlo ad un'altra finestra, non hai precisato se tale finestra è già visibile oppure è da creare/visualizzare.

    Ma per dirla banalmente con 2 righe di codice:
    AltroFrame altroFrame = new AltroFrame(ristoranteSelezionato);
    altroFrame.setVisible(true);
    È proprio banalmente semplice e tutto qui ..
  • Re: Informazioni sulle JList

    Ciao andbin! grazie per avermi risposto e avermi già chiarito alcune cose.

    Allora, avevo in effetti pensato che andasse costruita una classe " ristoranti " in cui salvare tutte le "variabili private" ma non è richiesto dal mio progetto; infatti devo considerare di " andare a prendere " queste informazioni da un foglio .txt cosi formato:

    Nome ristorante: pippi
    indirizzo: via ...
    numero: 333....
    ..
    ..
    Nome ristorante: pippo
    ...
    ..

    quindi la mia lista la creo con questi due metodi:
    void checkComune(){
        boolean testC = false;
            try{
            RandomAccessFile raf = new RandomAccessFile(r,"rw");
                for (int i =0; i<lc; i++){    
                    nome = raf.readLine().substring(16);
                    i++;
                    for(int k =0; k<2; k++){
                        i++;
                    raf.readLine();     
                    }
                    comune = raf.readLine().substring(8);
                    i++;
                    if(comune.equals(RComune.getText())){
                        ristoranti.add(nome); 
                    testC=true; 
                    } 
                     for(int k =0; k<5; k++){
                        i++;
                    raf.readLine();    
                    }   
                }
                if( testC == false ){
                    JOptionPane.showMessageDialog(rootPane,"Spiacente, nessun ristorante per il comune selezionato");
                    }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Registrazione.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Registrazione.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
    con questo codice faccio una ricerca sul mio file txt con tutti i ristoranti salvati e se il comune inserito corrisponde, salvo il nome del ristorante in un vector ( forse sarebbe meglio salvare tutte le informazioni relative al ristorante già adesso?)

    poi, con questo codice, stampo la JList risultante:
    void lista(){
        JFrame f = new JFrame("Lista ristoranti cercati");
        JList<String> jl = new JList<String>(ristoranti);
        
        f.getContentPane().setLayout(new FlowLayout());
        f.getContentPane().add(jl);
       
        f.setSize(800,800);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    ora, io vorrei che appena un utente seleziona una voce " nome " nella lista, appaia una nuova finestra a lato con scritte tutte le informazioni di quel ristorante, salvate sul file txt.

    penso che potrei sfruttare la tua soluzione per risolvere il mio " problema ".

    se però hai/avete consigli /critiche riguardo al codice scritto sopra ( che immagino sia sporchissimo.. ) non esitate a farmeli notare.. sono qui per imparare il piu possibile

    grazie mille!
  • Re: Informazioni sulle JList

    affamato ha scritto:


    ma non è richiesto dal mio progetto
    Semplicemente non è stato indicato/suggerito .... o è stato proprio detto di non usare una classe apposita??

    affamato ha scritto:


    con questo codice faccio una ricerca sul mio file txt con tutti i ristoranti salvati e se il comune inserito corrisponde, salvo il nome del ristorante in un vector ( forse sarebbe meglio salvare tutte le informazioni relative al ristorante già adesso?)
    Punto 1: non si usa RandomAccessFile per leggere file di testo! RandomAccessFile è tipicamente per file "binari" in cui si deve poter andare avanti/indietro con accesso "casuale". Si usano invece le altre classi di I/O, ottenendo al livello più alto un BufferedReader (che "sa" leggere a righe).

    Punto 2: tutti quei for e quei indici sono solo dell'ufficio "complicazioni" (... affari semplici).

    Punto 3: se la ricerca la fai molte volte, allora vuol dire che ad ogni ricerca devi rileggere il file. Risulta poco bello e poco efficiente.
    Una soluzione è leggere tutto il file all'inizio (o alla prima necessità) ma questo richiede appunto di "modellare" le cose come si deve. Comunque: il file .txt è ragionevolmente "fisso"? (quanto/quando viene modificato?)
    Anche volendo fare la rilettura ad ogni ricerca, i vari dati del ristorante trovato ha COMUNQUE senso modellarli come si deve.
  • Re: Informazioni sulle JList

    andbin ha scritto:


    affamato ha scritto:


    ma non è richiesto dal mio progetto
    Semplicemente non è stato indicato/suggerito .... o è stato proprio detto di non usare una classe apposita??
    essendo da solo a svolgere questo progetto, non vi è la richiesta di programmare la parte in cui un ristoratore salva le informazioni del proprio ristorante nell'applicazione.. ma sarà mia premura fornire al momento della soluzione, un file txt " pre confezionato" da me, per vedere se il mio programma gira e funziona correttamente.

    affamato ha scritto:


    con questo codice faccio una ricerca sul mio file txt con tutti i ristoranti salvati e se il comune inserito corrisponde, salvo il nome del ristorante in un vector ( forse sarebbe meglio salvare tutte le informazioni relative al ristorante già adesso?)

    affamato ha scritto:


    Punto 1: non si usa RandomAccessFile per leggere file di testo! RandomAccessFile è tipicamente per file "binari" in cui si deve poter andare avanti/indietro con accesso "casuale". Si usano invece le altre classi di I/O, ottenendo al livello più alto un BufferedReader (che "sa" leggere a righe).
    Ok, ho capito. Rifaccio tutto, usando un BufferedReader.

    affamato ha scritto:


    Punto 2: tutti quei for e quei indici sono solo "complicazioni" (... affari semplici).
    Tu come risolveresti il fatto di dover " navigare " fra le righe del foglio txt?

    affamato ha scritto:


    Punto 3: se la ricerca la fai molte volte, allora vuol dire che ad ogni ricerca devi rileggere il file. Risulta poco bello e poco efficiente.

    Una soluzione è leggere tutto il file all'inizio (o alla prima necessità) ma questo richiede appunto di "modellare" le cose come si deve. Comunque: il file .txt è ragionevolmente "fisso"? (quanto/quando viene modificato?)
    Anche volendo fare la rilettura ad ogni ricerca, i vari dati del ristorante trovato ha COMUNQUE senso modellarli come si deve.
    per quanto riguarda la mia soluzione non verrà mai modificato.


    ps: come avrai immaginato sono un neofita di java e ancor di più della parte " swing".. hai per caso qualche fonte da consigliarmi per capire meglio? al momento sto leggendo manuali online e guardando video tutorial in cui sperimentano le varie possibilità.. ma non so quanto siano realmente attendibili questi video tutorial.. ( l'utilizzo del RandomAccessFile per leggere un file di testo l'ho infatti visto in uno di questi.. )

    GENTILISSIMO.. davvero!
    Scusami se sto abusando della tua gentilezza
  • Re: Informazioni sulle JList

    affamato ha scritto:


    Tu come risolveresti il fatto di dover " navigare " fra le righe del foglio txt?
    Bisogna vedere le specifiche (detto in generale) del formato del file.
    - ci possono essere righe vuote (per leggibilità o altro)?
    - c'è un separatore tra ciascun "record" (ristorante)?
    - cosa dovrebbe succedere se mancano dei dati?
    - essendo fatto a righe e un record fatto su più righe, c'è un ordine ben preciso delle informazioni oppure no? (es. numero viene sempre dopo indirizzo?)

    Tutti questi aspetti (e altri che magari non ho in mente) influenzano il MODO di scrivere la logica di lettura del file.

    affamato ha scritto:


    l'utilizzo del RandomAccessFile per leggere un file di testo l'ho infatti visto in uno di questi..

    affamato ha scritto:


    Scusami se sto abusando della tua gentilezza
    Sono qui apposta da anni ..
Devi accedere o registrarti per scrivere nel forum
5 risposte