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

Discussione: Icona in una jlist

  1. #1
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160

    Icona in una jlist

    Salve, siamo a lunedì e con un nuovo quesito.

    Ho questo:

    codice:
    ArrayList<String> strings = new ArrayList();
    SearchableListModel listModel = null;
    strings = getArrayString();
    listModel = new SearchableListModel(strings);
    searchList = new javax.swing.JList();
    searchList.setModel(listModel);
    In particolare, l'ArrayList<String> strings è costituito da stringhe, appunto, tramite il metodo getArrayString().

    codice:
    public ArrayList<String> getArrayString(){
            UserProfile user = Persistence.getCurrentUserProfile();
            ContactsManager contactsManager = new ContactsManager(user);
            List<Contact> contactList;
            String name = "";
            String tel = "";
            String infoUser = "";
            ArrayList<String> cl= new ArrayList<String>();
            
            contactList = contactsManager.loadContacts();
    
            for (Iterator<Contact> it = contactList.iterator(); it.hasNext();) {
                Contact c = it.next();
                name = c.getName();
                tel = c.getTel();
                infoUser = name + " " + tel;
                cl.add(infoUser);
                
           }
    
            return cl;
        }
    Per avere un icona accanto a ciascun nome presente nella Jlist, dovrei implementare una classe che implementa ListCellRenderer. All'interno di questa classe, settare ciascuna cell (riga della jlist) data da "icona + stringa" e poi scrivere
    codice:
    searchList.setsetCellRenderer(new MyCellRenderer());
    La cosa che non capisco è come faccio nella classe che implementa ListCellRender a passargli la stringa, intesa come ciascun elemento dell'array di stringhe che riempie il listModel?

    Utilizzando appunto un listModel che estende l'interfaccia AbstractListModel, è cmq questo il corretto procedimento?






    ps: Spero di aver spiegato bene la situazione, devo dire che il lunedì mattina è proprio duro!

  2. #2
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Ho scritto questa classe:

    codice:
    // inner class che si occupa di visualizzare icona + testo
    // utilizzando il componente JLabel
    class CustomRow extends JLabel implements ListCellRenderer {
    
    	// metodo (unico!) dell'interfaccia ListCellRenderer
            public Component getListCellRendererComponent(JList list, Object value, int index,   boolean isSelected, boolean cellHasFocus) {
                    ImageIcon icon = new ImageIcon("images\\stella.png");
                    // testo dell'etichetta
                    setText(value.toString());
                    // icona da visualizzare
                    if(icon != null){
                        setText(value.toString());
                        setIcon(icon);
                    }
                    else
                        setText(value.toString() + " niente");
                    if (isSelected) {
                         setBackground(list.getSelectionBackground());
                         setForeground(list.getSelectionForeground());
                    } else {
                         setBackground(list.getBackground());
                         setForeground(list.getForeground());
                   }
                    return (this);
            }
    }
    Mi visualizza la jList, ma l'icona non la vedo e soprattuto quando seleziono uno degli elementi della jlist, non lo colora...cosa sbaglio?

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cool81
    La cosa che non capisco è come faccio nella classe che implementa ListCellRender a passargli la stringa, intesa come ciascun elemento dell'array di stringhe che riempie il listModel?
    Devi innanzitutto stabilire che cosa deve poter variare da cella a cella, se la stringa, la icona o entrambe. È chiaro che nel model di "oggetto" ce n'è solo 1 per ogni cella. Può essere quindi un String o un Icon ma se vuoi passare entrambi al renderer devi creare una tua classe che contiene i due dati. E chiaramente nel renderer sai che l'object ricevuto è della TuaClasse, quindi solito cast, estrazione dati, ecc....
    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 L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Questo codice visualizza l'icona.
    codice:
    class CustomRow extends JLabel implements ListCellRenderer {
    
    		// metodo (unico!) dell'interfaccia ListCellRenderer
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                    ImageIcon icon = new ImageIcon(getClass().getResource("/images/matita.png"));
    
                    // testo dell'etichetta
                    setText(value.toString());
                    // icona da visualizzare
                    if(icon != null){
                        setIcon(icon);
                        setText(" " + value.toString());
                        
                    }
                    else
                        setText(value.toString() + " niente");
                    if (isSelected) {
                         setBackground(list.getSelectionBackground());
                         setForeground(list.getSelectionForeground());
                    } else {
                         setBackground(list.getBackground());
                         setForeground(list.getForeground());
             }
                    return (this);
            }
    	}
    Ma non funziona la selezione, cioè non colora l'elemento selezionato.

    Se ho capito bene quello che mi dici, nel metodo che mi riempie l'array di stringhe getArrayString() , potrei passare anche l'icona? e poi nella classe CustomRow, come gli passo l'icona?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cool81
    Se ho capito bene quello che mi dici, nel metodo che mi riempie l'array di stringhe getArrayString() , potrei passare anche l'icona? e poi nella classe CustomRow, come gli passo l'icona?
    Il getElementAt() del list model ritorna un Object e .... il getListCellRendererComponent() del list renderer ha un parametro Object.

    L'oggetto potrebbe essere qualunque cosa .... lo devi ovviamente stabilire e "sapere" tu che gestisci il model e il renderer!!
    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 L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    La mia classe potrebbe benissimo essere "SearchableListModel extends AbstractListModel", nella quale ho questo metodo

    codice:
    public Object getElementAt(int index) {
            return icon + resultList.get(index);
        }
    chiamando questo metodo mi restituirà i'cona + la stringa. giusto?
    Solo che scrivendo così, nn m visualizza l'icona, ma il percorso. Quindi sto sbagliando qualcosa.

    E nella classe CustomRow che non riesco a capire come passargli questo oggetto perchè
    quando faccio
    codice:
    setText(value.toString());
    lmi scrive appunto il percorso dell'icona e nn visualizza l'icona. Quindi ...

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cool81
    codice:
    public Object getElementAt(int index) {
            return icon + resultList.get(index);
        }
    Questa "somma" non ha alcun senso ... dovresti restituire un oggetto di una TuaClasse che contiene 2 proprietà icona e testo. E chiaramente sarebbe meglio che il model stesso sia una lista di oggetti TuaClasse!!!!

    Originariamente inviato da Cool81
    E nella classe CustomRow che non riesco a capire come passargli questo oggetto.
    Ascolta ... spero che adesso lo capirai sennò non so più che cosa dire ..... se tu "sai" che il model restituisce un oggetto di una TuaClasse, allora sai che il 'value' che il getListCellRendererComponent() riceve (secondo parametro) è appunto un oggetto di questa TuaClasse. Fai un cast e tramite dei getter prendi icona e testo.
    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 L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Del parametro di getListCellRendererComponent() ok!

    Ma... il mio listModel si riempie con un ArrayList<String>. Su questo ho poi implementato un metodo di ricerca.

    Se al listModel, dovessi passargli un ArrayList<MiaClasse>, come devo poi implementare il metodo di ricerca?

    ops....forse la ricerca la devo fare su MiaClasse.getName che rappresenta la stringa?

    Ci provo, ma rimanete e soprattutto AndBin rimani in ascolto e in lettura...

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cool81
    Se al listModel, dovessi passargli un ArrayList<MiaClasse>, come devo poi implementare il metodo di ricerca?

    ops....forse la ricerca la devo fare su MiaClasse.getName che rappresenta la stringa?
    Si appunto, l'oggetto nel ArrayList non sarebbe ovviamente un String ma se la tua classe ha un metodo es. getTesto() ... beh, vedi che cambia molto poco!!!

    L'unica cosa che bisogna vedere (e che non ho ancora capito) è come associ le icone alle stringhe. Ogni stringa deve avere la sua icona? Sai a priori tutte le icone e stringhe e come associarle? L'associazione è "cablata" nel codice?

    Originariamente inviato da Cool81
    Ci provo, ma rimanete e soprattutto AndBin rimani in ascolto e in lettura...
    Son sempre qui ... non scappo ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Allora ho la seguente classe InfoUtente:

    codice:
    package rubrica;
    import javax.swing.ImageIcon;
    
    class InfoUtente {
        private String name;
        private ImageIcon icon = new ImageIcon(getClass().getResource("/images/stella.png"));
    
        public ImageIcon getIcon() {
            return icon;
        }
    
        public void setIcon(ImageIcon icon) {
            this.icon = icon;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    Riempio il listModel con un array risultato di questo metodo:

    codice:
      public ArrayList<InfoUtente> getArrayInfo(){
            InfoUtente infoUtente = new InfoUtente();
            UserProfile user = Persistence.getCurrentUserProfile();
            ContactsManager contactsManager = new ContactsManager(user);
            List<Contact> contactList;
            String name = "";
            String tel = "";
            String info = "";
            ImageIcon icon = null;
            
            ArrayList<InfoUtente> cl= new ArrayList<InfoUtente>();
    
            contactList = contactsManager.loadContacts();
           
            for (Iterator<Contact> it = contactList.iterator(); it.hasNext();) {
                Contact c = it.next();
                name = c.getName();
                tel = c.getTel();
                info = name + " " + tel;
                infoUtente.setName(info);
                icon = infoUtente.getIcon();
                cl.add(infoUtente);        
           }
    
            return cl;
        }
    E mia classe CustomCell è diventata così:

    codice:
    class CustomRow extends JLabel implements ListCellRenderer {
    
    //metodo (unico!) dell'interfaccia ListCellRenderer
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
               InfoUtente info = new InfoUtente();
    
    //icona da visualizzare
       setIcon(info.getIcon());
    
    //testo dell'etichetta
       String s = info.getName();
       setText(s);
    
       return (this);
       }
    }
    Mi visualizza le icone, ma non il getName dell'oggetto InfoUtente. In più credo che si tratti sempre dello stesso oggetto, ma questo è un dubbio. Quale passaggio mi sto dimenticando?

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.