JComboBox com auto complete e Map de Objetos

Postado por Ugleiton Carneiro dia 21 de dezembro de 2010 as 05:27

O objetivo da implementação desse combo foi facilitar o desenvolvimento de aplicações que utilizam persistência, onde os combos criados nas aplicações representam entidades de um banco de dados, o mesmo funciona também como os combobox convencionais pois extendes da classe JCombobox.

Para a utilização do mesmo faça o download do jar UGComp.jar e importe o mesmo para a paleta do netbeans, caso ainda não saiba como fazer isso siga o tutorial Adicionando Componentes a Paleta do NetBeans. Depois adicione a o jar UGLibrary.jar a biblioteca do seu projeto.

Os combos convencionais só guardam as descrições de um objeto, como por exemplo, um combo preenchido com nomes de pessoas não guarda todas as informações dessa pessoa e a aplicação necessita de todos os dados para processamento ou preenchimento de tela.
O componente UJComboBox adiciona a descrição e o próprio objeto da descrição, funcionando em paralelo com um hashMap.
Veja como utilizar:

Preenchendo
private void carregarCombo(){
        //limpa o combo
        uJComboBox1.clear();
        Pessoa p = new Pessoa();
        p.setNome("Fulado de Tal");
        p.setCpf("02523646257");
        /**
         * observe que aqui é setado o nome da pessoa como descrição
         * e o próprio objeto pessoa para se buscado depois
         */
        uJComboBox1.addItem(p.getNome(), p);

        p = new Pessoa();
        p.setNome("outra pessoa");
        p.setCpf("00000000000");
        uJComboBox1.addItem(p.getNome(), p);
    }

Pegando Objeto
/**
     * @return pessoa com nome selecionado
     */
    private Pessoa getCombo(){
        /**
         * para retornar o objeto utilise o método getSelectedObject
         * para retornar o nome utilize o método getSelectedItem
         */
        return (Pessoa) uJComboBox1.getSelectedObject();
    }

Além de guardar as informações de forma mais precisa, ele também possui uma propriedade auto complete, que foi implementada utilizando classes da biblioteca swingx.
Veja como utiliza-la:
Depois de ter selecionado o componente na sua aplicação, marque a propriedade auto completar.


Enquanto o usuário digita o combo vai completando e selecionando a palavra.



15 comentários:

lucas disse...

To usando o componente de vcs no meu sistema de estágio.. parabéns ele realmente é muito bom, principalmente quando se trata de guardar o objeto alme da descrição.. simplesmente o que faltava para desenvolver utilizando Java =D

hudo henrique: hudo.sabugo@gmail.com disse...

eae galera, bom to usando o componente de voces, mas aqui ele nao esta funcionando o "autocompletar", aparece a mensagem falha ao gravar o valor "autocompletar", alguém sabe me dizer o pq?
Minha versão do netbeans é a 7.0.1

Programador do Sertão disse...

e ai hugo, o componente é só meu mesmo, não tem nenhum grupo de pessoas envolvidas,
Vc está usando uma outra biblioteca chamada UGLibrary no seu projeto? sem ela nada funciona. poderia me enviar a classe onde se encontra o o componente?

hudo henrique: hudo.sabugo@gmail.com disse...

Desculpa não reparei que era so voce, Parabens.
Bom eu consegui, mas de uma forma diferente, sim baixei a biblioteca e tudo mais oque pede. Mesmo assim nao funciono.
Bom de forma resumida eu Abrir o NotePad++, abrir a classe que ta no netbeans a .java e adicionei o que faltava "boxMarca.setAutocompletar(true);"
ai funciono, mas sem isso nao funcionava.
Abraços e ahh e add no msm. abraços

Programador do Sertão disse...

~_O
as vezes o meu netbeans fica doido... tenho que apagar todas as pastas do usuário para ele funcionar novamente, tá aceito

Mixulidio disse...

Bacana Cara, Show Mesmo,
Tem algumas coisinhas ainda para corrigir como...
o uso do Backspace: quando a string está totalmente selecionada não funciona
ou quando se digita e não satisfaz a condição de ter o item na lista e depois utilizar o backspace a "cunsulta/filtro" não funciona de forma "inversa"
No meu netbeans realmente não funcionou a opção, mas funcionou via código: uJComboBox1.setAutocompletar(true); value a dica do hudo.
Mas muito bom, se aplica perfeitamente...
Abraços...

hudo henrique: hudo.sabugo@gmail.com disse...

To a procura de emprego, acabando a facu agora, tem alguma noticia por ae nao? se tiver da um toque no msn. Abraços. rererere

Mixulidio disse...

A questão do BackSpace... eu tinha colocado editable = true, se for false funciona blz...

Me dá uma dica preciso selecionar um desses objetos via código, por exemplo, em um JtextField o cara "scaneia" o código que quer no UJComboBox aparece o código e a descrição do produto.

setSelectedIndex(int);
setSelectedItem(obj);

como poderia fazer este "relacionamento" com uma pesquisa?

Programador do Sertão disse...

Mixulidio daria setSelectedObject(obj), mas ele só funciona com strings

Anônimo disse...

Bom dia !

Estava aqui pensando não funcionaria, acrescentar (Definir propriedade uJComboBox1's autocompletar usando: codigo personalizado?
Estou tentando fazer funcionar aqui não estou conseguindo, tem alguma dica ?
Se for colocar via codigo, em que parte devo acrescentar o setAutocomtemplar(true);

Atenciosamente,
Francis

Programador do Sertão disse...

Francis

Se for via código, vc deve colocar no "Construtor da Classe" depois dos códigos de definição de tela
No Netbeans por exemplo tem uma linha que executa o método initComponents(), vc poderia setar a propriedade após essa linha. ficando assim:
.....
initComponents();
SEUCOMBO.setAutocompletar(TRUE);
......

Jessica Mello disse...

Oi cara gostei muito do seu ComboBox só que eu queria que não aparece nada embaixo do campo digitado, ficando como se fosse um JTextField você sabe se tem como fazer algo assim?
Já tentei fazer um TextField com AutoCompletar só que ai não consigo pegar o valor como Objeto.

Leonardo Holanda disse...

Olá amigo,

Estou utilizando os componentes que você customizou, são realmente excelentes.
Eu só estou com 1 simples probleminha com o UJComboBox, é o seguinte.
Na minha aplicação, eu faço com que a tecla Enter funcione da mesma maneira que a tecla Tab, adiciono evento de KeyPressed, defino a condição:
----------------------------------------------------------------
private void uJComboBox1KeyPressed(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER){
uJComboBox2.requestFocus();

}
}
------------------------------------------------------------------
Mas não funciona de jeito nenhum. Já tentei diversas maneiras de fazer o seu combo mudar de foco teclando Enter e não consegui.

Se vc ou alguém tiver alguma solução para isso por favor me envie, estou precisando muito.

Mande para meu email: holandaleo@msn.com

Valeu !

octanaza disse...

Gostei cara, vc está de parabéns. Seguir o seu tutorial e conseguir fazer e entender ate a carga do ComboBox, funcionou perfeito como eu queria, com autocompletar e tudo. blz. Agora preciso pegar o codigo da seleção da combobox e faço isso quando o usuario clica no combobox. Vc pode me dar um exemplo no meu uJComboBox1ActionPerformed como pegar o objeto do meu modelo. Seguir o seu exemplo e está dando erro, ele da essa mensagem:java.lang.ClassCastException: java.lang.String cannot be cast to modelo.Protese. Vc poderia me ajudar como devo fazer.
Obrigado.
Octacilio Nazaré de Salvador-Ba.

Ugleiton Menezes disse...

Octanaza, estou meio enferrujado no java, mas acredito que para pegar o item selecionado ao clicar com o mouse seria assim:

//exemplo usando o itemStateChanged
uJCombo.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
Object obj = new Object();
obj = uJCombo.getSelectedItem();
//ou se vc fez o mapeamento dos objetos pode ser assim
obj = uJCombo.getSelectedObject();
}
});

Postar um comentário

Marcadores

Computação (8) Java (7) Excel (2) Humor (2) NetBeans (2) Textos (2) Curiosidades (1) IRPF (1) Musicas (1)