JComboBoc com função de pesquisa

3 respostas
mateusviccari

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?

3 Respostas

E

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

mateusviccari

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.

mateusviccari
Tentei fazer um na mão mesmo, até que ficou bom, segue o código:
/*
 * 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<Object> 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();
    }
    
}
Criado 5 de setembro de 2012
Ultima resposta 5 de set. de 2012
Respostas 3
Participantes 2