[RESOLVIDO]Dúvida sobre Time e TimerTask (fazer busca após alguns segundos)

5 respostas
Vin_ius_Abreu_de_Fra

Olá pessoal, vou ser direto… Tenho um jTextField chamado campoDePesquisa, queria que após digitar algo no campo de pesquisa passados três segundos ele executasse o método buscar, entedem? Tentei fazer um teste com Timer no ListenerHadler OnCaretUpdate e ele gera vários timers…

Alguém tem idéia de como faço isso? :roll:
Um abraço.

5 Respostas

RenanRosa

Vin?ius Abreu de Fran?:
Olá pessoal, vou ser direto… Tenho um jTextField chamado campoDePesquisa, queria que após digitar algo no campo de pesquisa passados três segundos ele executasse o método buscar, entedem? Tentei fazer um teste com Timer no ListenerHadler OnCaretUpdate e ele gera vários timers…

Alguém tem idéia de como faço isso? :roll:
Um abraço.

não seria melhor colocar o metodo de busca no keyListener do JTextField ?

Vin_ius_Abreu_de_Fra

Bom, dá no mesmo porquê o caretUpdate executa quando um caractere é atualizado e o keyTyped no momento da digitação mas acho que é melhor mesmo porquê ao clicar no campo usando caretUpdate ele executa do mesmo jeito sendo que com keyTyped não. Valeu a dica… Mas ainda fico no aguardo de alguma luz aqui na solução. :smiley:

RenanRosa

do jeito que falei não precisa colocar um timer, ele buscaria no banco a cada tecla precionada. Mas então…
vai ter que criar um timer fora do caretUpdate, nem vai ser necessário o caretUpdate, apenas coloca no evento do timer para fazer a consulta, ou se quiser acionar no caretUpdate vai ter que criar o time fora e dentro do caretUpdate verificar se ele está instanciado (timer != null)
se não estiver você da um new nele, se não apenas utilize.

Vin_ius_Abreu_de_Fra

Oi RenanRosa, consegui aqui… é mais ou menos o que você disse mas acho que você não entendeu o que quis dizer, eu estou querendo que ao digitar o que vai ser buscado no JTextField ele espere 3 segundos para iniciar a busca… Do mesmo jeito da busca de amigos no orkut por exemplo…

Segue o código de como consegui…

Primeiro, no início da classe, declaro um Timer e um AbstractAction.

...
    private Timer timer;
    private AbstractAction action;
...

Na minha aplicação (espero que na de vocês tenha) tem um método de inicialização de componentes, então inicializei o Timer e a Action. Como a AbstractAction é uma Interface tive que implementar o método actionPerformed. Setei o timer com 3 segundos e passei a action que é a ação que será executada, também setei o timer.setRepeats para false para ele não repetir a ação e executar apenas uma vez por chamada.

action = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                if (jRadioButtonCodigo.isSelected() && !campoPesquisa.getText().equals("")) {
                    System.out.println("BUSCA POR NÚMERO");
                    buscaPorNumero();
                } else if (jRadioButtonNome.isSelected()) {
                    if (campoPesquisa.getText().length() >= 3) {
                        System.out.println("BUSCA POR STRING");
                        buscaPorString();
                    }
                }
            }
        };
        timer = new Timer(3000, action);
        timer.setRepeats(false);

Depois no handler campoPesquisaKeyTyped apenas chamo o timer.stop() pra parar qualquer chamada anterior e dou um timer.start() novamente para voltar a contar os três segundos para executar a ação;

private void campoPesquisaKeyTyped(java.awt.event.KeyEvent evt) {                                       
        timer.stop();
        timer.start();
    }

Pronto! Assim busca só será feita após 3 segundos de quando eu parar de digitar!
Obrigado a todos! Um abraço.

RenanRosa

Vin?ius Abreu de Fran?:
Oi RenanRosa, consegui aqui… é mais ou menos o que você disse mas acho que você não entendeu o que quis dizer, eu estou querendo que ao digitar o que vai ser buscado no JTextField ele espere 3 segundos para iniciar a busca… Do mesmo jeito da busca de amigos no orkut por exemplo…

Segue o código de como consegui…

Primeiro, no início da classe, declaro um Timer e um AbstractAction.

...
    private Timer timer;
    private AbstractAction action;
...

Na minha aplicação (espero que na de vocês tenha) tem um método de inicialização de componentes, então inicializei o Timer e a Action. Como a AbstractAction é uma Interface tive que implementar o método actionPerformed. Setei o timer com 3 segundos e passei a action que é a ação que será executada, também setei o timer.setRepeats para false para ele não repetir a ação e executar apenas uma vez por chamada.

action = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                if (jRadioButtonCodigo.isSelected() && !campoPesquisa.getText().equals("")) {
                    System.out.println("BUSCA POR NÚMERO");
                    buscaPorNumero();
                } else if (jRadioButtonNome.isSelected()) {
                    if (campoPesquisa.getText().length() >= 3) {
                        System.out.println("BUSCA POR STRING");
                        buscaPorString();
                    }
                }
            }
        };
        timer = new Timer(3000, action);
        timer.setRepeats(false);

Depois no handler campoPesquisaKeyTyped apenas chamo o timer.stop() pra parar qualquer chamada anterior e dou um timer.start() novamente para voltar a contar os três segundos para executar a ação;

private void campoPesquisaKeyTyped(java.awt.event.KeyEvent evt) {                                       
        timer.stop();
        timer.start();
    }

Pronto! Assim busca só será feita após 3 segundos de quando eu parar de digitar!
Obrigado a todos! Um abraço.

beleza, obrigado pelo retorno da solução, assim quem tiver a mesma dúvida fica mais facil.

Criado 20 de maio de 2011
Ultima resposta 21 de mai. de 2011
Respostas 5
Participantes 2