Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [JAVA] Combobox ...e selezione indiretta

    Ciao a tutti.

    Qualcuno potrebbe aiutarmi a capire come gestire questa situazione?

    Sto finendo di realizzare una GUI per il calcolo del codice fiscale. Per la selezione del comune di nascita vorrei caricare i vari nomi in una JComboBox.
    Poi quando scelgo il nome nella combobox vorrei invece ottenere il codice (quello a 4 cifre per intenderci) del comune associato.
    Nel file .txt ho l'elenco di tutti i comuni d'Italia, ed il relativo codice a 4 cifre...

    Al momento ho risolto inserendo nella combobox come stringa... sia il nome del comune che il codice a 4 cifre... ed una volta effettuata la scelta gli faccio tagliare le ultime 4 cifre... ed ottengo solo il codice.

    Io invece vorrei che nella combobox comparisse solo il nome del comune, senza il codice... ma quindi poi non so come recuperarlo quando seleziono il nome del comune desiderato.


    Girando per la rete ho notato che forse dovrei utilizzare delle collections (HashMap, ArrayList, ecc.) ma non so proprio come impostare la questione. Chi mi può aiutare? Grazie in anticipo!


    PS. sono newbie di Java (e di programmazione in generale) e lo sto studiando perché vorrei realizzare un mio gestionale... Sto cercando di fare un'infarinata generale e devo dire che mi trovo abbastanza bene.

  2. #2
    Finora ho trovato una soluzione usando il metodo .entryMap()

    Nell'actionEvent associata alla combobox inserisco questo codice:

    codice:
    for (Map.Entry<String, String> m: comuni_map.entrySet()) {
        String selezionato = cmb_luogo.getSelectedItem().toString().trim();
        String nome_comune = m.getValue();
        if (selezionato.equals(nome_comune)) String codice_comune = m.getKey();
    }
    ...dove comuni_map è la HashMap<String, String> (che sono rispettivamente "Codice_4_cifre", "Nome_Comune (Prov)" caricati dal file txt) dichiarata privata e precedentemente istanziata...

    Tutto funziona, ma il problema è che l'elenco con tutti i comuni d'Italia è vastissimo... quindi l'iterazione per confrontare selezionato e nome_comune rallenta molto l'esecuzione...

    C'è un modo più semplice di confronto? Ho letto dell'utilizzo di interfacce comparable, ecc., ma se servono e mi aiutate a capire come si implementano ve ne sarei grato.

    Ciao


    PS. o in generale c'è proprio una soluzione più idonea a risolvere il problema di associare alla cobobox un valore indirettamente?

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    certo che c'è un metodo molto più semplice
    crei una classe che identifichi un comune

    codice:
    public class Comune
    {
      private String nome,prov,codice
      
      public Comune( /* metti i metodi di costurttore*/)
      {...}
      
      /* crei i dovuti set/get */
    
      @Override
      public String toString(){return getNome();}
    a questo punto tu carichi un array di comune nel tuo combobox e lui mostrerà solo quello che restituisce il metodo toString().

    A questo punto per ottenere il codice selezionato basta fare semplicemente questo

    Comune comuneSelezionato = (Comune) cmbListaComuni.getSelectedItem();
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  4. #4
    Grazie Hysoka per la risposta,

    se ho capito bene... devo creare un Array di Comuni[] caricandoli dal file.txt.

    Quindi per esempio incapsulo il metodo getNome_Comune() che mi serve visualizzare a schermo nell'elenco della combobox...

    Poi faccio un override del metodo toString della mia classe Comuni per farmi restituire il nome_comune del comune selezionato...

    Quindi faccio un casting della selezione nella classe Comuni...
    codice:
    Comune comuneSelezionato = (Comune) cmbListaComuni.getSelectedItem();

    A questo punto per avere il codice_4_cifre lo devo riottenere dal metodo getCodice4Cifre() che ho scritto nella mia classe Comuni... con qualcosa del tipo:
    codice:
    String codice = comuneSelezionato.getCodice4Cifre()
    E' corretto così?

    Ciao e grazie infinite!

  5. #5
    La classe l'ho progettata... ma non riesco a gestirla

    codice:
    public class Comuni {
        private String nome, prov, cod;
        
        public Comuni() {
            //  costruttore vuoto...
        }
    
        public void setNome(String nome) {
            this.nome = nome;
        }
        public String getNome() {
            return nome;
        }
    
        public void setProv(String nome) {
            this.nome = nome;
        }
        public String getProv() {
            return nome;
        }
    
        public void setCod(String nome) {
            this.nome = nome;
        }
        public String getCod() {
             return nome;
        }
    
        public String toString() {
             return getNome();
        }
    }
    A questo punto però se provo a dichiararla nel main faccio dei grandissimi casini (sono troppo proprio newbie!!!).
    1) nel main della mia applicazione la dichiaro "private" e la istanzio... ma non so il numero di array[...].
    2) non so come assegnarle i valori che leggo nell'elenco del file.txt
    3) come metto tutti gli oggetti creati (se ci riesco) nella combobox?

    Io provo a smanettarci su intanto di avere qualche ulteriore consiglio.

  6. #6
    Ho capito la "mia" domanda3:
    → facendo l'override del metodo toString... quando carico oggetti nella combobox questa nel suo elenco mi visualizza il return di toString...
    Quindi nel mio caso, se carico un Array di oggetti Comuni... nella combo appare il listato dei loro metodi toString → ossia getNome().

    Ora mi rimane (si fa per dire) di capire come dal file listacomuni.txt posso creare l'Array della mia classe Comuni... Ancora non ci riesco... consigli?

  7. #7
    Mi sono accorto che nel creare la Classe Comuni ho commesso delle sviste nelle operazioni di copia&incolla dei get/set:

    Riporto la classe corretta:

    codice:
    public class Comuni {
         private String nome, prov, cod;
              public Comuni() {
             //  costruttore vuoto...
         }
    
         public void setNome(String nome) {
             this.nome = nome;
         }
         public String getNome() {
             return nome;
         }
     
         public void setProv(String prov) {
             this.prov = prov;
         }
         public String getProv() {
             return prov;
         }
     
         public void setCod(String cod) {
             this.cod = cod;
         }
         public String getCod() {
              return cod;
         }
     
         public String toString() {
              return getNome();
         }
     
    }

  8. #8
    Stop alle telefonate!!!

    Dopo tanto ho capito dove sbagliavo... Non capivo che la JCombobox è un contenitore visuale di oggetti... e non mi rendevo conto che un item può restituire un oggetto (io pensavo solo la stringhe testuali).

    Ora è tutto chiaro!!!

    In pratica quando carico il file.txt e lo scompongo in righe, da ognuna delle quali creo un oggetto... non faccio altro che aggiungere l'oggetto alla combobox. Questo è una parte del codice che ho usato nel costruttore (la classe Comuni sta la trovate sopra...):

    codice:
    cmb = new JComboBox();
      //  Carica ed istanzia ogni linea in un comune della classe Comuni...
      InputStream in = getClass().getResourceAsStream("/escomboobj/listacomuni.txt");
      BufferedReader input = new BufferedReader(new InputStreamReader(in));
      try {
        String line = null;
        while (( line = input.readLine()) != null){
          Comuni comune = new Comuni();
          comune.setNome(line.split(";")[1]);
          comune.setProv(line.split(";")[2]);
          comune.setCod(line.split(";")[6]);
    
          // Qui inserisco l'istanza comune nella combobox...
          cmb.addItem(comune);
          //System.out.println("Comune → " + comune + " (" + comune.getProv() + ") --→ " + comune.getCod());
        }
      }
      catch (FileNotFoundException e) {System.err.println("/codicefiscale/listacomuni.txt");}
      finally {input.close();}
      //  ------------------------------------------------------------
    
      cmb.setEditable(true);
      pnl.add(cmb);
      ActionListener actionListener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
        if (e.getSource()==cmb) {
          Comuni selezionato = (Comuni) cmb.getSelectedItem();
          System.out.println("Codice Selezione= " + selezionato.getCod());
        }
      }
    };
    cmb.addActionListener(actionListener);

    Prima di modificare il titolo del thread in [Risolto] avrei bisogno di un ulteriore chiarimento. Il mio dubbio è se ci fossero due comuni con lo stesso nome io avrei il riferimento sempre a quello corretto nell'indice della combo, oppure nella riassociazione viene scelto il primo trovato...).
    Questa cosa mi fa pensare se il riconoscimento è fatto per valore o per riferimento... o sto ipotizzando una cavolata?

    Grazie ancora!

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.