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:

codice:
...
        searchTextField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                updateSearchResults(searchTextField.getText() + e.getKeyChar());
            }
        });
...
Secondo voi è corretto o c'è un modo migliore, più "raffinato"? :master:
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[]{});
    }