Javafree

Como implementar um ComboBoxModel em Java

Publicado por equipejavafree em 13/11/2013 - 6.639 visualizações

Artigo escrito por: D3z40



Antes de tudo gostaria de uma breve apresentação, meu nome é André, sou programador a mais ou menos um ano e meio (até a data deste tutorial), atualmente trabalho com VB6, linguagem que aprendi através do VBA do Excel, programa que aprendi a usa-lo com tutoriais na internet, alguns amigos e muita força de vontade, até chegar ao nível de dar aula de Excel e VBA, depois disso fiz um cursinho muito básico em Java (E quando falo ?muito básico?, acreditem foi muito, muito básico), linguagem que me fascinou deste o primeiro contato e continua até hoje, e fui me especializando com estudos contínuos pela internet e com alguns livros. Atualmente além de continuar estudando Java, também estudo PHP, e também pela internet. Decidi compartilhar isso com vocês, por que para quem esta começando a programar, qualquer linguagem assusta, mas garanto a todos, com emprenho e vontade vocês conseguiram aprender até sozinhos.



Bem, vamos lá!!!


Participando aqui do fórum percebi que muita gente tem duvidas sobre implementação do ComboBoxModel, e para piorar tudo, na internet não tem nada muito claro que possa realmente ajudar. Foi pensando nisso que resolvi criar esse tutorial com um exemplo fácil, simples e bem resumido, não tratei erros como, por exemplo, não remover um item do JComboBox quando a lista já estiver vazia, por que esse não é intuito do tutorial, e até por que cada projeto terá sua maneira de tratar erros. E é claro peço desculpas por possíveis erros, ou falta de esclarecimento, pois como grande maioria também sou um eterno aprendiz.



Fiz um exemplo bem básico, mas bem proveitoso, vamos começar pela classe modelo, que é a classe que representa seu objeto, geralmente são os dados que serão persistidos. OBS: Tomem cuidado com packages.



Classe Estado (Modelo)




Acabamos de criar a classe que será representada no nosso JComboBox, nada além do que não conhecemos, uma classe com atributos e seus getters e setters. Para não deixar nenhum código muito confuso ou com muitas obrigações, criei uma classe apenas para nos auxiliar na criação e preenchimento de um List, sendo assim vamos criar uma classe chamada ControlEstados.



Classe ControlEstados (Auxiliar)


Esta classe apenas tem um construtor sem parâmetros que instancia o nosso List, e um método que configura este List com vários estados.



Agora vem a parte que mais nos interessa, o nosso ComboModel. O que precisamos saber é que teremos que implementar (implements) a interface ComboBoxModel que por sua vez estende (extends) a também interface ListModel<E>. Antes de começarmos irei explicar um pouco dessas duas (2) interfaces.


Na interface ComboBoxModel existem apenas dois (2) métodos a serem implementados:




Este método é usado pelo próprio componente JComboBox para setar (configurar) o objeto que está selecionado.




Este método é usado pelo próprio componente JComboBox para getar (retornar) o objeto que está selecionado.



Já na interface ListModel (que é estendida pela interface ComboBoxModel) existem quatro (4) métodos, dos quais teremos que implementar apenas dois (2), um deles é o método:




Este método recebe um int como parâmetro que será usado como índice para retornar o objeto da lista.




Já este método retorna um int que é total de itens no nosso JComboBox.



Estes são os métodos que teremos que implementar e os principais para que nosso ComboBoxModel funcione da maneira que queremos.


Além de implementar a interface que citei acima devemos estender (extends) a classe abstrata AbstractListModel<E> que também implementa a interface ListModel. Lembram daqueles dois (2) métodos que disse que não precisaríamos implementar, pois é, não precisamos por que estendemos esta classe que já os implementam.


Precisamos estender essa classe por que precisamos de três métodos dessa classe, são eles:




Responsável por atualizar por inteiro o conteúdo do JComboBox.




Responsável por atualizar o intervalo de dados que foram inseridos no JComboBox.





Responsável por atualizar o intervalo de dados que foram removidos no JComboBox.



Esses métodos não precisamos implementar, pois eles já estão prontos para serem usados, iremos apenas chama-los quando atualizamos os dados do JComboBox, seja atualizar, remover ou inserir.


Vamos para os detalhes da classe que será nosso ComboBoxModel.




Começamos declarando os atributos composto por um List que será nossa lista de estados, e também um atributo selectedEstado do tipo Estados para que seja guardado o objeto que esta selecionado no componente JComboBox. Criei também uma constante para representar o primeiro item da lista, somente para não parecer números ?fantasmas? no nosso código.




Criaremos dois (2) construtores, um sem parâmetros do qual instanciamos a nossa lista, e outro que recebe um List que adicionamos na lista principal. Reparem que chamamos o método ?setSelectedItem? para selecionar o primeiro objeto da lista.




Este método usaremos para retornar um objeto da lista conforme índice que foi passado pelo parâmetro.




Neste método apenas retornamos o tamanho da lista.




Retornamos o atributo ?selectedEstado? que é o responsável por guardar o objeto selecionado no componente JComboBox.




Setamos o atributo ?selectedEstado? que é o responsável por guardar o objeto selecionado no componente JComboBox.



Estes métodos visto até aqui são os que devemos implementar, agora veremos alguns métodos que foram incluídos para que possamos incluir um ou mais objeto, remover e atualizar um ou mais objeto também.




Método para adicionarmos um item na lista, reparem que a partir deste precisamos chamar os métodos da classe AbstractListModel para atualizar a lista do componente, neste caso como estamos adicionando usamos o fireIntervalAdded.




Outro para adicionar Estados, porém este adiciona uma lista.




Método que remove objeto selecionado da lista.




E por ultimo um que limpa todos os objetos da lista.



Vamos para o código da classe, como ficou no final.



Classe EstadosComboModel (ComboBoxModel)




Antes de continuarmos precisamos informar para o componente JComboBox como ele deverá exibir nosso objeto em sua lista, algumas pessoas sobrescrevem o método ?toString? na classe modelo, para indicar de forma textual como exibir o objeto. Mas a melhor forma sem duvida é renderizar o objeto, como mostro no exemplo abaixo:





Agora é só passar esse render para o componente JComboBox dessa maneira. (Veremos na classe com o frame.




Agora veremos a classe responsável pela interface gráfica com o JFrame, não irei entrar em detalhes nesta classe, postarei para que possa ser testado e estudado por todos que se interessarem pelo tutorial.





Só um detalhe, reparem que criei meus próprios Listeners para cada evento dos botões que usamos, as classes internas são as melhores opções para este tipo de ação.



Bem, fico por aqui e espero realmente que todos gostem, e ajudem mais ainda no estudo individual, e claro, que acabe com as duvidas sobre ComboBoxModel.



André de Andrade Pereira


dede2andrade@hotmail.com