Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160

    Ricerca dinamica in una jList

    Salve,

    sono sempre io, presente più che mai e ancor più in cerca d utili consigli per superare gli ostacoli della programmazione.

    Detto questo, il mio problema è il seguente:

    in un'applicazione desktop, all'interno di un jframe ho una jlist e una jtextfield.

    La jlist è inizialmente riempita con un array di stringhe.
    La jtextfield contiene i caratteri da ricercare nella jlist, quindi nell'array di stringhe.

    La parte difficile è che man mano che si digita nella jtextfield, la jlist deve visualizzare i possibili risultati. Occorre quindi riaggiornare in tempo reale (non so se l'espressione è corretta) l'array di stringhe che a sua volta riempie la jlist.

    Non so proprio da dove cominciare.
    Ho capito che forse l'evento che mi serve sulla jtextfield è il DocumentListener, ma non so proprio come implementare il tutto. E cosa fare dopo!

    HELP HELP HELP HELP HELP HELP HELP

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Ricerca dinamica in una jList

    Originariamente inviato da Cool81
    Non so proprio da dove cominciare.
    Per gestire il JList sarebbe molto appropriato, in questo caso, realizzare un apposito "list model" (estendi AbstractListModel). Definisci un metodo nel tuo model che riceve la stringa da cercare, il model esegue la ricerca, aggiorna la sua struttura interna (che devi definire e gestire tu) e quindi notifica l'aggiornamento con un metodo fireXXX().

    Per ricevere notifica della modifica su un JTextField, indubbiamente il modo più completo è quello di usare un DocumentListener.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Allora andiamo con ordine.

    Al momento, riempio la mia lista così:

    codice:
    String[] strings = getArrayString(); 
    userList = new javax.swing.JList(strings);
    dove il metodo getArrayString() mi trasforma una List d oggetti in un array di stringhe.

    Per creare la jlist come dici tu, cosa dovrei scrivere?

    ps: scusa se t chiedo le cose passo passo, ma sto proprio in difficoltà!

  4. #4
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Ho provato a continuare.
    Allora ho scritto:

    codice:
    class ListData extends AbstractListModel {    
    ArrayList usersData = new ArrayList();   
    String[] strings = new String[usersData.size()];   
    List_panel listPanel = new List_panel();       
    public ListData() {     
    strings = listPanel.getArrayString();   
    }    
    public int getSize() {     
    return strings.length;   
    }    
    public Object getElementAt(int index) {     
    return strings[index];   
    } 
    }
    e poi quando creo la jlist, faccio così:

    codice:
    userList = new javax.swing.JList(); 
    ListData ld = new ListData(); 
    userList.setModel(ld);
    Poi lancio il programma, ma poi mi viene lanciata la seguente eccezione:


    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    Ho letto che questo tipo d eccezione viene lanciata quando c sn troppe ricorsioni, ma non riesco a capire se questo è il mio caso.

  5. #5
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Il problema era la ricorsione. Ho risolto implementando il metodo getArrayString() nella classe che estende AbstractListModel.
    Adesso all'interno di questa stessa classe, devo implementare un metodo di ricerca di una stringa in un array di stringhe.

    Continua....

  6. #6
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Ho implementato unmetodo di ricerca:

    codice:
    class ListData extends AbstractListModel {    
    ArrayList usersData = new ArrayList();   
    String[] strings = new String[usersData.size()];          
    public ListData() {     
    strings = getArrayString();       
    }      
    
    public ListData(ArrayList al){          
    }    
    
    public int getSize() {     
    return strings.length;   
    }    
    
    public Object getElementAt(int index) {     
    return strings[index];   
    }      
    
    public ArrayList searchString(String s){       
    ArrayList searchResult = new ArrayList();       
    for (int i = 0; i < strings.length; i++) {           
    if(strings[i].contains(s)){               
    searchResult.add(strings[i]);           
    }                  
    }       
    return searchResult;   
    }    
    
    public String[] getArrayString(){         
    ...
    }  }
    Ho scritto un metodo di ricerca e ho aggiunto un altro costruttore di questa classe che prendere come parametro l'arrayList risultato della ricerca.
    Adesso:
    1. come faccio a dire al ListModel di aggiornare la sua struttura?
    2. dato che la ricerca la faccio in una array di stringhe, l'arrayList è composto anche esso di stringhe, vero?

    Aspetto fiduciosa risposte che non siano le mie.
    Chiedo scusa ai moderatori per questo mio modo di fare, ma in attesa delle risposte altrui, provo a procedere e se giungo a qualcosa ke ritengo utile posto.


  7. #7
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Sempre nella stessa classe ho implementato l'interfaccia DocumentListener ed implementato i metodo astratti.
    Adesso ho il codice riportato nel file allegato.

    Ma se scrivo qualcosa nella textfield, non succede niente nella jList, cioè quest'ultima non si aggiorna in tempo reale visualizzando già i risultati.

    Sicuramente ho dimenticato qualche collegamento o qualcosa altro...il problema è COSA???

    Dai qualcuno che mi illumini......

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Esempio completo:

    codice:
    import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class SearchableListTestFrame extends JFrame {
        private static final String[] parole = {
            "gatta", "gattabuia", "gattaia", "gattaiola", "gattamorta",
            "gatteggiamento", "gatteggiare", "gattesco", "gattice",
            "gattinara", "gattino", "gatto", "gattofilo", "gattomammone",
            "gattonare", "gattoni", "gattopardesco", "gattopardismo",
            "gattopardo", "gattuccio",  "gauchesco", "gauchisme",
            "gauchismo", "gauchista", "gaucho", "gaudente", "gaudere",
            "gaudio", "gaufré", "gaullismo", "gaullista", "gauss",
            "gavaina", "gavazzamento", "gavazzare", "gavazzatore",
            "gavetta", "gavettino", "gavettone", "gaviale", "gavigliano",
            "gavigne", "gavillare", "gavina", "gavitello", "gavocciolo",
            "gavone", "gavotta", "gay", "gazare", "gazatrice", "gazatura",
            "gazebo", "gazella", "gazofilacio", "gazometro", "gazoso",
            "gazza", "gazzarra", "gazzella", "gazzetta", "gazzettiere",
            "gazzettino", "gazzettistico", "gazzosa",
        };
    
        private JTextField textField;
        private SearchableListModel listModel;
        private JList list;
        private JScrollPane scrollPane;
    
        public SearchableListTestFrame() {
            super("Searchable List Test");
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(300, 300);
    
            Container contentPane = getContentPane();
    
            listModel = new SearchableListModel(parole);
    
            textField = new JTextField();
            list = new JList(listModel);
            scrollPane = new JScrollPane(list);
    
            contentPane.add(textField, BorderLayout.NORTH);
            contentPane.add(scrollPane, BorderLayout.CENTER);
    
            textField.getDocument().addDocumentListener(new DocumentListener() {
                public void changedUpdate(DocumentEvent e) { search(); }
                public void insertUpdate(DocumentEvent e) { search(); }
                public void removeUpdate(DocumentEvent e) { search(); }
            });
        }
    
        private void search() {
            listModel.search(textField.getText());
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    SearchableListTestFrame f = new SearchableListTestFrame();
                    f.setVisible(true);
                }
            });
        }
    }
    
    
    class SearchableListModel extends AbstractListModel {
        private String[] strings;
        private ArrayList<String> resultList;
    
        public SearchableListModel(String[] strings) {
            this.strings = strings;
            resultList = new ArrayList<String>();
            search("");  // search fittizio per setup iniziale
        }
    
        public Object getElementAt(int index) {
            return resultList.get(index);
        }
    
        public int getSize() {
            return resultList.size();
        }
    
        // Metodo custom per eseguire la ricerca
        // e modificare il model
        public void search(String searchString) {
            resultList.clear();
    
            for (int i = 0; i < strings.length; i++) {
                // Verifica solo la parte iniziale
                // (è possibile fare qualunque altro tipo di "filtro")
                if (strings[i].startsWith(searchString)) {
                    resultList.add(strings[i]);
                }
            }
    
            // IMPORTANTE!!! Serve a notificare come minimo la
            // "view" di JList
            fireContentsChanged(this, 0, resultList.size() - 1);
        }
    }
    Alcune note:
    - Notare i metodi del DocumentListener che invocano un metodo privato che semplicemente prende il testo del text field e lo passa al metodo search() del model.
    - Notare i commenti nel SearchableListModel
    - Le parole sono prese da un dizionario online ... perchè ho iniziato da "gatta" potete immaginarlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Grazie dell'esempio completo che stamattina ho subito cercato di fare mio.

    Ho modicato il costruttore del metodo search() così:



    codice:
    public void search(String searchString) {
            resultList.clear();
    
            for (int i = 0; i < strings.length; i++) {
                if(searchString != null && !searchString.equals("")){
                    if(strings[i].contains(searchString)){
                    resultList.add(strings[i]);
                    }
                }
                
            }
    
            // IMPORTANTE!!! Serve a notificare come minimo la
            // "view" di JList
            fireContentsChanged(this, 0, resultList.size() - 1);
        }
    Avvio l'applicazione e quando visualizzo il panel che contiene la jlist, questa è vuota.
    E provando anche a scrivere qualcosa nella textfield della ricerca, non cambia nulla.

    Aspetto i vostri utilissimi consigli!!!!!!!!

    Intanto controllo meglio quando istanzio la jlist, dato che credo che sia lì il problema.


  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cool81
    codice:
            for (int i = 0; i < strings.length; i++) {
                if(searchString != null && !searchString.equals("")){
                    if(strings[i].contains(searchString)){
                    resultList.add(strings[i]);
                    }
                }
                
            }
    La tua ricerca parziale è corretta. Prova a metterla nel mio esempio e vedrai che funziona.
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.