Boas pessoal,
Tenho na minha JFrame uma campo de texto, que aonde é feita a consulta de nome dos cliente na base de dados.
Eu gostaria que a aplicação fizesse a busca automatica enquanto o utilizador estivesse escrevendo, ou seja, se o operador começou digitando "LUI " ele ja vai começando apanhar na base de dados todos os clientes cujo primeironome comecem com LUI
é mais ou menos como o netbeans faz, voce vai digitando e ele ja vai completando com os dados que estão na base de dados.
eu ja tenho tudo estruturado para que quando eu coloque um nome no campo de texto ele va a base de dados e me apanhe todos os clientes que comecem com o nome que eu digitei e me coloque numa JList. mas para ele fazer isso eu preciso pressionar um botao, mas acontece que eu nao quero q seja preciso pressionar o botao para ele começar a fazer a busca ,
Coloca um evento no JTextField, de modo que ele “escute” quando uma tecla foi pressionada sobre ele. Se uma tecla foi pressionada consequentemente o texto foi alterado, e logo a busca na base de dados deve ser atualizada…
textField.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
});
Você deve colocar o código que chama o método de busca em um dos métodos acima… Esta é uma interface, então todos estes 3 métodos devem estar presentes, mesmo que vc não preencha todos eles… Veja o que melhor atende sua necessidade…
Eu coloquei no KeyTyped mas o problema é que aminha base de dados tem muitos clientes (4,000,000 de clientes ) e quando eu começo a escrever a primeira letra ele leva muito tempo para trazer os dados por tem muitos resultados
qual a solução para este caso ?
Fiz o que voce sugeriu mas mesmo assim perde-se muito tempo a base de dados tem muitos clientes !
alguem sabe me dizer se ha alguma forma de aumentar a rapides na consulta ao banco de dados ? ou seja tornar o retorno dos dados mais rápidos ?
Vc precisa saber se o problema esta :
1 - No tempo de execução da query
2 - No tempo de transporte dos dados pela rede ou no tempo que vc demora para tratar os dados e atualizar a tela.
No primeiro caso, vc deve melhorar a performance de acesso a sua tabela criando indices ou outros artefatos (dependendo do BD). Veja isso com o seu DBA.
No segundo caso se for tempo de transporte dos dados, vc terá que reduzir a quantidade de respostas obtidas aumentando a quantidade de caracteres minima. No caso de demora no tratamento das informações, você pode otimizar o seu metodo de tratamento. No caso de chegar ao limite de otimização vc deverá fazer como já mencionado, diminuindo o resultado aumentando o minimo de caracteres.
Na sua necessidade acredito que nos dois ou três primeiros caracteres você não deva lançar uma consulta pois ,devido a grande quantidade de registros, torna-se lento e os resultados nunca lhe trariam algum dado relevante.
Por isto sugiro que você consulte apenas do terceiro/quarto carcter para frente.
No select , retorne somente os campos que são relevantes para a sua visualização.
Limite o número de registros retornados pela consulta utilizando o “limitador” que o SGBD lhe fornece.
Exemplo Mysql :
SELECT nome FROM clientes where nome like ‘ABC%’ LIMIT 0,20
Eu fiz um componente JTextLookupCombo, que permite o usuario digitar algumas letras e pressionar ENTER. Em seguida, ele preenche o combobox automaticamente com o resultado do filtro.
Isso esta sendo bastante satisfatorio, pois acabei com todos os lugares que usava JComboBox puro e mudei para este componente. Ate abrir a tela ficou muito melhor, e da opcao do usuario pesquisar pela descricao ou pelo codigo.
Se quiser olhar o codigo, baixe o SubMacroForms.zip da pasta SubMacroForms/src no site http://submacro.java.dev.net (Documents & files).
[quote=cassio]Coloca um evento no JTextField, de modo que ele “escute” quando uma tecla foi pressionada sobre ele. Se uma tecla foi pressionada consequentemente o texto foi alterado, e logo a busca na base de dados deve ser atualizada…
textField.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
Aqui dentro o que iria?
}
public void keyPressed(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
});
Você deve colocar o código que chama o método de busca em um dos métodos acima… Esta é uma interface, então todos estes 3 métodos devem estar presentes, mesmo que vc não preencha todos eles… Veja o que melhor atende sua necessidade…