Classe Robot , problema em relação a Focus. [RESOLVIDO]

Olá pessoal, tudo bem?
Então, estou fazendo um programa (bot) para um jogo. No entanto, preciso usar a classe Robot para o controle do mouse. (embora esse não seja o problema do tópico)
A situação é a seguinte:

  • Tenho uma classe que extends JFrame implements KeyListener, quando o usuário aperta F12 ele vai ativar o looping infinito que consequentemente irá chamar toda hora o método limparInventario(), até este ser interrompido. (teoricamente, ele será interrompido quando o usuário apertar F10 ou F11.)
    (obs: robot é o objeto da classe Robot. o delay que é settado na primeira linha (é recebido atraves de um JOptionPane) atraves de um atributo int da classe Ouvinte e posteriormente, tal como no código é passado como delay para o objeto robot.)
   public void limparInventario() 
    {
         robot.delay(ouvinte.getDelay());
         robot.mousePress(InputEvent.BUTTON3_MASK);
         robot.mouseRelease(InputEvent.BUTTON3_MASK);
         robot.keyPress(32); // 32 == barra de espaço.
         robot.keyRelease(32);
    }

Fragmento da classe que extends JFrame implements KeyListener

 public void keyPressed(KeyEvent e)
    {
      
       if(e.getKeyCode() == e.VK_F12)
       {
         while(flag == true)
         {
           if(e.getKeyCode() == e.VK_F10)
           {
           flag = false;
           }
           else if(e.getKeyCode() == e.VK_F11)
           {
           System.exit(0);
           }
           else
           {
           limparInventario();
           }
         }

       }
       
    }

O Problema é o seguinte, o usuário aperta F12, então o programa funciona perfeitamente como eu esperava. mas, se o usuário decidir apertar o F10 para pausar o jogo ou F11 para finalizar o programa não aceita e continua no looping infinito. Acredito que isso seja um problema em relação ao Focus , alguem sabe se é isso mesmo e sabe me indicar uma possível solução?

[]
ArchV.

Se não me engano, esse seu loop deve rodar em outra Thread (se não me engano…) pois acho que ele está ocupando a Thread que trata dos eventos e por isso não está recebendo as informações sobre pressionamento de teclas.

hmm, e como eu posso tratar este problema? (procurei e não achei nada a respeito).

[]
ArchV.

Cria uma outra thread…

Dentro do método keyPressed() deixe assim:

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == e.VK_F12) {
        inciaRobo();
        return;
    }
    if(e.getKeyCode() == e.VK_F10) {
        paraRobo();
        return;
    }
    if(e.getKeyCode() == e.VK_F11) {
        System.exit(0); // cuidado! evite isso (isso mata a JVM)
        // procure sair do programa encerrando as Thread e usando um dispose()
        return;
    }
}

Aí crie dois novos métodos:

private void inciaRobo() {
    flag = true;
    new Thread(new Runnable() {
        public void run() {
            while (flag) {
                limparInventario();  
            }
        }
    }).start();
}

private void paraRobo() {
    flag = false;
}

[quote=marcobiscaro2112]Dentro do método keyPressed() deixe assim:

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == e.VK_F12) {
        inciaRobo();
        return;
    }
    if(e.getKeyCode() == e.VK_F10) {
        paraRobo();
        return;
    }
    if(e.getKeyCode() == e.VK_F11) {
        System.exit(0); // cuidado! evite isso (isso mata a JVM)
        // procure sair do programa encerrando as Thread e usando um dispose()
        return;
    }
}

Aí crie dois novos métodos:

[code]
private void inciaRobo() {
flag = true;
new Thread(new Runnable() {
public void run() {
while (flag) {
limparInventario();
}
}
}).start();
}

private void paraRobo() {
flag = false;
}
[/code][/quote]

Vlw brother, funcionando perfeitamente agora.

  • Você poderia me explicar pq foi necessário criar uma thread, (não estudei isso muito ainda) de forma resumida já basta. ?
  • Não entendi muito bem quando ali nomédoto do KeyPressed sendo que ele é “void” você pede que ele use o “return” qual seria a função do return nesse sentido?

Abraço!

Obrigado.

[]
ArchV.

Uma Thread é uma execução “em paralelo” à outras (entre aspas pois isso depende de algumas circunstâncias; para simplificar, vamos assumir que seja em paralelo) que executa determinada ação. Por exemplo, em um jogo online, existe uma Thread para redesenhar a tela, uma para atualizar valores, uma para tocar sons, uma para tratar da entrada/saída de dados na rede, e assim por diante.

Tudo que você coloca dentro do keyPressed roda na Thread responsável por tratar eventos. Se um loop “prende” a Thread naquele método, eventos posteriores não serão processados. Por isso a necessidade de outra Thread: seu loop roda nessa segunda Thread, enquanto eventos de entrada são processados normalmente.

Isso apenas diz que o método deve interromper sua execução naquele trecho (ou seja, retornar). É uma técnica comum usar um ‘return;’ em métodos void para controle de fluxo (geralmente fica melhor que ‘if … else if … else if … else …’).

[quote=marcobiscaro2112][quote=ArchV]

  • Você poderia me explicar pq foi necessário criar uma thread, (não estudei isso muito ainda) de forma resumida já basta. ?
    [/quote]
    Uma Thread é uma execução “em paralelo” à outras (entre aspas pois isso depende de algumas circunstâncias; para simplificar, vamos assumir que seja em paralelo) que executa determinada ação. Por exemplo, em um jogo online, existe uma Thread para redesenhar a tela, uma para atualizar valores, uma para tocar sons, uma para tratar da entrada/saída de dados na rede, e assim por diante.

Tudo que você coloca dentro do keyPressed roda na Thread responsável por tratar eventos. Se um loop “prende” a Thread naquele método, eventos posteriores não serão processados. Por isso a necessidade de outra Thread: seu loop roda nessa segunda Thread, enquanto eventos de entrada são processados normalmente.

Isso apenas diz que o método deve interromper sua execução naquele trecho (ou seja, retornar). É uma técnica comum usar um ‘return;’ em métodos void para controle de fluxo (geralmente fica melhor que ‘if … else if … else if … else …’).[/quote]

Vlw brother, saquei.

=)