6 de mar de 2016

Completar automaticamente ComboBox

Baseado nessa postagem do GUJ, eu criei um simples exemplo de auto complete em ComboBox. O que ele basicamente faz é:


  • Quando o usuário digita com o ComboBox selecionado, ele trabalha com uma String temporária que armazena o texto;
  • A cada tecla digitada, o conteúdo do combobox é mostrado e atualizado;
  • Se backspace é digitado, atualizamos o filtro;
  • A cada tecla digitada, mostramos os itens do combo box, quando o combo box é oculto, o filtro é limpo e a tooltip ocultada.

O resultado é mais ou menos o seguinte:



O código da classe e mais uma aplicação de exemplo está abaixo. Coloquei também no github, me mande PR para melhorar e há MUITAS melhorias a serem feitas, como suporte a espaço e acentos.



3 comentários:

  1. Legal, código limpo e funcional, adicionei uma função ao final chamada de unAccent:
    public static String unAccent(String s) {
    String temp = Normalizer.normalize(s, Normalizer.Form.NFD);
    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
    return pattern.matcher(temp).replaceAll("");
    }

    Dessa forma, caso digite pérsia, o filtro ainda ficará como "persia", mas irá buscar após adicionar o unAccent na stream do filtro:
    itens.filter(el -> unAccent(el.toString()).toLowerCase().contains(txtUsr)).forEach(filteredList::add);

    ResponderExcluir
  2. Oi, adorei seu blog! visita o meu?
    http://cantinhodearely.blogspot.com.br/

    ResponderExcluir
  3. Cara, o que significa :: como na linha 34 da classe ComboBoxAutoComplete? Eu pesquisei mas nao achei nada, só com : usando no for each.
    Eu posso instanciar essa classe(ComboBoxAutoComplete) assim ComboBoxAutoComplete'<'Integer'>' cmc = new ComboBoxAutoComplete<>();, usando interiros, por exemplo? Se não pq criou ela de forma genérica?

    ResponderExcluir