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: