JComboBoc com função de pesquisa

Bom dia, tenho a seguinte idéia:
Em uma tela de nota fiscal, iserir um JCombbBox que seria o campo para escolha do cliente, então eu faria uma pré pesquisa no banco e jogaria todos os clientes dentro do combobox.
Vamos supor que eu tivesse os seguintes clientes cadastrados:
MARIO
JOSÉ
CLEVELINO

Eu gostaria de, ao digitar, por exemplo, JOS no combobox(com o editor dele editavel) ele abrisse o painel suspenso e mostrasse apenas os clientes que contivessem o JOS no nome, no caso mostrando apenas o JOSÈ.

Alguem tem uma ideia de como poderia fazer isso?

O nome disso é “autocomplete”. Um exemplo de JComboBox com autocomplete pode ser encontrado na biblioteca Glazed Lists.

não é bem auto complete, pois o auto complete vai manter todos os itens no combobox, só vai selecionar aquele que iniciar com o que o usuario digitou.
Eu gostaria de fazer uma filtragem, removendo os itens do combo que não possuem no seu toString() o texto que o usuario digitou.

Tentei fazer um na mão mesmo, até que ficou bom, segue o código:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package _componentes;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.text.JTextComponent;

/**
*

  • @author adm
    */
    public class ComboBoxFiltro extends JComboBox {

    ArrayList lista=new ArrayList<>();

    public ComboBoxFiltro() {
    setEditable(true);
    getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
    @Override public void keyReleased(KeyEvent e) {
    if( KeyEvent.getKeyText(e.getKeyCode()).length()==1 ){
    pesquisar();
    }
    }
    });
    }

    private void pesquisar() {
    String text = ((JTextComponent)getEditor().getEditorComponent()).getText();
    super.removeAllItems();
    for(Object o : lista){
    if(o!=null && o.toString()!=null && o.toString().toLowerCase().contains(text.toLowerCase())){
    super.addItem(o);
    }
    }
    showPopup();
    ((JTextComponent)getEditor().getEditorComponent()).setText(text);
    }

    @Override
    public void addItem(Object item) {
    lista.add(item);
    }

    @Override
    public void removeItem(Object anObject) {
    lista.remove(anObject);
    }

    @Override
    public void removeItemAt(int anIndex) {
    lista.remove(anIndex);
    }

    @Override
    public void removeAllItems() {
    lista.clear();
    }

}
[/code]