Jcombobox

:?: Pessoal, estou com um problema…, tenho um jComboBox de bairro, que carrega os bairros de uma determinada cidade, eu preciso carregar uma grande quantidade de bairros (por exemplo: 5.000 itens) no combo, porem quando carrego os itens no combo, minha aplicação fica muito lenta, pois é claro combobox não foi feito para carregar grande quantidade de itens. Estou com a idéia de carregar estes itens aos poucos no combo, por exemplo: de 100 em 100, ou de 200 em 200, isto sendo acionado pelos botões do ScrollBar do combo, mas preciso saber como faco para pegar o evento dos botoes deste scroolbar do combo.

Por favor se alguém souber ou tiver uma outra sugestão me ajudem…

Obrigado

Gustavo Alvim.

Olá galvim

Nossa, você realmente precisa buscar todos esses bairros? Você tem isto em uma base de dados? Não seria possível solicitar que o usuário colocasse um CEP (ou talvez o bairro) e o programa retorna-se os dados restantes (bairro e rua no caso do CEP), ou fazer com que o usuário digite, mas que o programa valide o bairro, comparando com a base de dados?

[]s

Carlos H

Olá galvim… posso estar enganado (bem provável) mas talvez seja possivel interceptar os eventos de mouse na JScrollBar que está embutida no objeto controlador do JComboBox (MVC)… (também sou novato no desenvolvimento em Java, mas estarei dando uma olhada nas APIs… se descobrir antes, me dê um alô) :roll:

Carlos,

Carlos tenho esta base de dados, mas quando fiz a pergunta eu citei o caso de bairros como um exemplo, eu tenho que desenvolver uma classe Jcombo em java que permita carregar apenas 50 itens no combo, de pouco em pouco, para a aplicação não ficar tão carregada. Estamos já a algum tempo tendo este problema na empresa. Esta classe funcionará para qualquer tipo de dados.
Eu trabalho em uma empresa de Geoprocessamento, e nos trabalhamos com muitos dados geográficos, por isso a necessidade.
A minha classe já esta filtrando os dados, no caso se o usuário fizer a pesquisa direto no combo e também vários outros controles já foram feitos, mas ainda não consegui encontrar o evento do jscroll embutido no jcombobox.

Ainda sou novato em java… mas se alguem tem uma idéia por favor me ajude, pois eu tenho que fazer isto…

Obrigado

Gustavo. :smiley:

Dango,

Muito obrigado pela dica, vou pesquisar também na Api.

Valeu.

Gustavo

uma ideia para fazer isto ai é o seguinte, vou pegar o exemplo dos bairros também :slight_smile:

antes dos bairros, coloque um combo para o cara escolher a cidade, e antes da cidade, o estado, assim, o combo da cidade só sera preenchido quando o cara escolher o estado, o dos bairros só quando o cara escolher a cidade, …
e assim por diante, isto deve funcionar para qualquer tipo de aplicação :slight_smile:

no caso de uma aplicação WEB, você pode colocar os combos em layers/divs assim pode carrega-los quando necessário :slight_smile:

ahh, seguinte, encaro a minha resosta da seguinte maneira :slight_smile:

no inicio da jornada espacial, tanto os russos quanto os americanso descobriram que as canetas tinteiro existentes na epoca não escreviam no espaço pro falta de gravidade :slight_smile:
os americanos, gastaram alguns bilhões em pesquisas, e inventaram a maravilhosa caneta esferografica que utilizamos hoje.
os russos levaram um lapis para o espaço :slight_smile:

Rodrigo, me desculpe mas vc não entendeu minha pergunta, isto que vc falou é simples de fazer, alias aminha aplicação ja faz isto…

EU QUERO É DESCOBRIR COMO FAÇO PARA PEGAR O EVENTO DO MOUSE QUANDO CLICADO NA BARRA DE ROLAGEM EMBUTIDA NO COMBO.

Gustavo.

Galvim, a esta altura da evolução da computação, vc deve suspeitar de tudo o que é muito difícil ou muito demorado de fazer.

Não sei qual é o poder de negociação que vc tem na sua empresa, mas em termos de iterface homem-máquina, um ComboBox de 200 itens não serve. Muito mais interessante é um campo de texto onde o cara digita os primeiros caracteres (se ele consegue achar uma entrada numa lista com 200 itens, ele sabe o começo do nome) e o combo-box aparece como auxiliar no momento que as opções diminuem a um nível aceitável. Se aceitável, no seu caso, significar 200 entradas, eles já vão ficar bem felizes. Eu chutaria que 10% do total é uma quantidade aceitável para um Combo.

Mas uma vez que vc quer mesmo é um JComboBox que faz carga parcial dos dados, vc pode implementar um JComboBoxModel que faça a carga parcial. Pra ativar a mudança de janela (a janela que “deixa ver” só uma parte dos dados), vc quer ouvir o Scroll. Pensa no seu código já implementado, e rodando… o usuário arrastando, confiante, a barrinha pra baixo… até onde ele vai para acontecer um Poltergeist??

Como vc vai explicar pra quem tá usando? Vc quer que a barrinha desca proporcionalmente ao TODO dos dados, mas que a lista só mostre UMA PARTE deles, certo? Vai fundo… Cria o JComboBox de forma que vc sempre tenha a JScrollBar vertical (dentro do JComboBox tem um JScrollPane que tem uma JScrollBar), e então vc adiciona a ela um java.awt.event.AdjustmentListener e boa viagem!!

Se funcionar, ensina, hein?? Deve ter um monte de coisa aí que eu não pensei…

Aquelão!!
Tiago.[/b]

É galvim… depois de tudo o que pessoal considerou (principalmente o que o dukejeffrie escreveu) eu acho que você deve reconsiderar a UI.

Por outro lado, talvez em casa, numa tarde fria de garoa fina, com uma boa chícara de café fresco, seja interessante aprimorar o domínio da linguagem tentando implementar algo parecido.

Mas em produção…; sei não, acho meio arriscado (eu falo com conhecimento de causa, por que quando o cliente resolve “empuleirar” no ombro e “por pilha” daí fica difícil implementar qualquer coisa.

Mas eu estarei dando uma olhada (já estou) e assim que tiver alguma “luz” eu volto a postar neste tópico.

Um abraço.

EU QUERO É DESCOBRIR COMO FAÇO PARA PEGAR O EVENTO DO MOUSE QUANDO CLICADO NA BARRA DE ROLAGEM EMBUTIDA NO COMBO.

Com certeza vc deve ter q adicionar um listener nele… eu nunca fiz isso mas com certeza tem e não é difícil… A Melhor forma de ver isso é lendo o código desse componente e lá vai estar implementada essa interface…

Scroll.addActionListener(new ScrollListener() {

public void Clicou() {
seuCombo.removeTudo();
seuCombo.adicionaNovos();
}
});

Então com o listener nele vc trata os eventos do seu combo…

Finalmente alguem entendeu minha pergunta …

Blackhat, eu também já estive pensando nisto, você sabe como faço para acessar o código do componente jCombobox, tem como, eu não sei, por favor me explique melhor…

Gustavo Alvim

No JSDK vem o código fonte de toda a classpath do seu JDK em source.zip no linux,solaris etc…

Você precisa descompactar, nos ambientes de unix ele instala automaticamente nos windows vc pode escolher isso, se vc esta rodando windows veja se nao tem o arquivo source.zip ou src.zip e descompacte ele, se nao tiver re-instala o jsdk e escolhe os sources… Ai entao vc vai conseguir entender melhor como funcionam estes JComponent de swing e com certeza deve ter listeners pq cada um desses objetos são herdados de JComponent, outras classes e varias interfaces…

Senao tiver vc le a licensa da sun (nunca li entao nao posso dizer q vc pode fazer isso) e ve qual é a restricao de modificar esse codigo, mas acho que vc nem vai prescisar…

Blackhat, muito obrigado pela dica…

Hoje, analisando o código do componente jcombobox, não obtive grandes êxitos, mas acho que eh por ai, não consegui encontrar aonde e quando o combo adiciona o Scrollbar no Popup, estou verificando se acho em outras classes e interfaces implementadas pelo Jcombo, mas por enquanto nada… hehe…
… mais não vou desistir, tenho que descobrir como interceptar este evento do scrollbar, agora comecei vou até o fim, tem que ter um jeito,… por favor se tiver alguma sugestão dá um alô.

Valeu.

Gustavo Alvim

Se eu fosse vc parava de tentar com listener e partiria para outra solução.

O Scroll q vc procura esta no package plaf… e acredite, vc não quer mexer com isso.

javax.swing.plaf.basic.BasicComboPopup

Eu já dei uma olhada quando vc colocou a pergunta na info exame.

Tenho certeza que a outro modo de fazer o q vc quer.

Falo.

mlopes,

Muito obrigado pela informação, realmente este scroll esta no plaf, voce disse que ha outro meio para fazer isto, por favor me de uma dica ja que voce tem certaza que há outro meio.

Ahh, estou com um outro pequeno problema no meu combo …
…quando realizo uma pesquisa direto no combo, ou seja, digitando os caracteres eu visualizo os resultados automaticamente no Popup conforme o digitado, por exemplo: Uberlandia, o popup irá visualizar Uberlandia selecionado. Eu realizo esta pesquisa pegando cada caracter, ex.: Ub… o Popup irá mostrar a primeira ocorrencia de Ub…% no banco…
Tudo bem, meu problema é o seguinte, quando digito nomes com espaço, o Popup fecha quando digito espaço, ex.: Sao Jose dos Campos, nos tres espacos do texto digitado o popup fecha… Já tentei forçar a visualização do Popup no evento do espaço com o “showPopup()” mas não adianta…

Alguém tem uma sugestão?

Agora estou só com estes dois problemas, o problema do Scrool e este do espaço.

Minha Classe combo já esta muito legal, consigo pesquisar no combo mostrando os itens parcialmente e se eu também for descendo ou subindo o combo com as setas de (Down, Up, PageDown, PageUp) ele realiza estas cargas parciais quando chega no ultimo ou no primeiro item do combo não importando o tamanho de itens no Banco de Dados. Por exemplo uma banco de 100.000 itens funcionaria perfeitamente não carregando a aplicação.

Por favor pessoal, eu sei que tem umas coisas complicadas de se fazer mas me ajudem, eu tenho que fazer isto.

Gustavo Alvim