Ho aggiunto al mio programma una funzionalità di ricerca "istantanea", in pratica vengono mostrati i risultati già mentre si sta scrivendo (come ad esempio Spotlight di Mac OS X).
L'ho implementata (molto semplicemente) in questo modo:
Secondo voi è corretto o c'è un modo migliore, più "raffinato"? :master:codice:... searchTextField.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { updateSearchResults(searchTextField.getText() + e.getKeyChar()); } }); ...
Al momento nei miei test non ho avuto problemi ma nel database ho solo una decina di snippet. Se nel database ce ne sono molti c'è il rischio che la ricerca sia ancora in corso mentre digito. Come potrei evitare questo problema? :master:
Grazie
Questi gli altri metodi coinvolti:
codice:private void updateSearchResults(String text) { StringTokenizer tokenizer = new StringTokenizer(text, ","); if (tokenizer.countTokens() == 0) { return; } String[] keywords = new String[tokenizer.countTokens()]; for (int i = 0; i < keywords.length; i++) { keywords[i] = tokenizer.nextToken().trim(); } String[] results = DBController.getInstance().search(keywords, Settings.getInstance(). getSearchOptions()); resultsList.setListData(results); if (results.length == 0) { Toolkit.getDefaultToolkit().beep(); } } ... public String[] search(String[] s, SearchOptions options) { TreeSet<String> result = new TreeSet<String>(); if (options.searchIntoName()) result.addAll(Arrays.asList(searchIntoName(s))); if (options.searchForTags()) result.addAll(Arrays.asList(searchForTags(s))); if (options.searchIntoCode()) result.addAll(Arrays.asList(searchIntoCode(s))); if (options.searchIntoComment()) result.addAll(Arrays.asList(searchIntoComment(s))); return result.toArray(new String[]{}); }

Rispondi quotando