Implements KeyListener [RESOLVIDO]

Pessoal…
Eu tou fazendo 1 exemplo simples, de imprimir a tecla que a pessoa aperta durante a aplicacao, que tem um jFrame…
Por que nao ta funfando? Deem 1 olhada no codigo:

[code]public class BottingRules extends JFrame implements KeyListener {

private static final long serialVersionUID = 1L;
private JLabel lblf1;
private JLabel lblf2;
private JLabel lblwellcome;
boolean flag;

public BottingRules()  {
	setTitle("Exemplo");
	setResizable(false);
	setLayout(new MigLayout());
	setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	// /
	instanciarcomponentes();
	// /
	add(lblwellcome, "wrap");
	add(lblf1, "wrap");
	add(lblf2, "wrap");
	// //
	pack();
	setLocationRelativeTo(null);
}

private void instanciarcomponentes(){
	lblwellcome = new JLabel("Exemplo de Robot");
	lblwellcome.setForeground(Color.blue);
	lblf1 = new JLabel("Aperte F1 para Iniciar");
	lblf2 = new JLabel("Aperte F2 para Parar");
}


public static void main(String[] args) {
	new BottingRules().setVisible(true);
}

@Override
public void keyPressed(KeyEvent e) {		
	System.out.println(e);
}

@Override
public void keyReleased(KeyEvent e) {		
}

@Override
public void keyTyped(KeyEvent e) {	
}

}[/code]

Faltou chamar o método addKeyListener e registrar o seu frame como listener, mesmo que seja dele mesmo.

Adicione addKeyListener( this ); no corpo da classe

add(lblwellcome, “wrap”);
add(lblf1, “wrap”);
add(lblf2, “wrap”);
addKeyListener( this );
// //
pack();
setLocationRelativeTo(null);

e no método keypressed coloque conforme abaixo:

@Override
public void keyPressed(KeyEvent e) {
System.out.println(KeyEvent.getKeyText( e.getKeyCode()));
}

Opa…
Valew…
Funcionou direitinho… Mas teve um probleminha:

[code]package com.pedro.tibiabot;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Font;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

import net.miginfocom.swing.MigLayout;

public class BottingRules extends JFrame implements KeyListener {

private static final long serialVersionUID = 1L;
private JLabel lblf1;
private JLabel lblf2;
private JLabel lblwellcome;
boolean flag;
Robot robot;

public BottingRules() {
	setTitle("Botting is ROX");
	setResizable(false);
	setLayout(new MigLayout());
	setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	// /
	instanciarcomponentes();
	// /
	add(lblwellcome, "wrap");
	add(lblf1, "wrap");
	add(lblf2, "wrap");
	addKeyListener(this);
	// //
	pack();
	setLocationRelativeTo(null);
}

private void instanciarcomponentes() {
	lblwellcome = new JLabel("Bot is Legal now =)");
	lblwellcome.setForeground(Color.blue);
	lblwellcome.setFont(new Font("Courier", Font.BOLD + Font.ITALIC, 20));

	lblf1 = new JLabel("Aperte F1 para Iniciar");
	lblf2 = new JLabel("Aperte F2 para Parar");

	try {
		robot = new Robot();
	} catch (AWTException e) {
		e.printStackTrace();
	}
}

public static void main(String[] args) {
	new BottingRules().setVisible(true);
}

private void iniciaRobo() {

	new Thread(new Runnable() {
		public void run() {
			while (flag == true) {
				robot.mouseMove(1135, 540);
				robot.mousePress(InputEvent.BUTTON1_MASK);
				robot.mouseMove(540, 395);
				robot.mouseRelease(InputEvent.BUTTON1_MASK);
				robot.delay(2000);
			}
		}
	}).start();
}

private void paraRobo() {
	flag = false;
}

@Override
public void keyPressed(KeyEvent e) {
	if (e.getKeyCode() == e.VK_F1) {
		lblf1.setText("ON");
		iniciaRobo();
		flag = true;
		return;
	}
	if (e.getKeyCode() == e.VK_F2) {
		lblf1.setText("OFF");
		paraRobo();
		return;
	}
}

@Override
public void keyReleased(KeyEvent e) {
}

@Override
public void keyTyped(KeyEvent e) {
}

}
[/code]
Para eu apertar o F2, eu tenho que estar com o frame na tela…
Mas quando eu aperto f1, e ele inicia o robot, o focus vai para a aplicacao… Entao se eu apertar o f2, ele nao para…
Eu tenho que apertar no Frame, e depois apertar f2…
Como que eu faco para adicionar o KeyListener, em vez de no this, para a aplicacao que esta aberta?
addKeyListener(NA APLICACAO); ou entao addKeyListener(NA JANELA QUE ESTIVER ABERTA);

Pelo que entendi, você está fazendo um bot para o Tibia e quer que quando você pressione o F2 (mesmo com a janela do Tibia em foco) o Robot pare. É isso mesmo? Se for, desculpe informar, mas aí a coisa complica. O Swing não consegue capturar eventos de tecla que ocorrem fora de uma aplicação Java (no caso, na janela do jogo). Se não me engano, SWT suporta isso, mas você terá que partir por um caminho totalmente diferente…

Tibia eh jogo de viado…
Tou level 153… E vou vender meu char semana que vem por 3200,00
To jogando MU, e tou level 257…

Mesmo para tibia, entao como que funciona bots como NG, Elfbot e tal?
Estou fazendo 1 para MU, mas precisa funcionar da mesma maneira…

Nao tem como ele sempre ficar com focus?
Ja vi 1 programa que eu usava a uns 4 anos atras, que chamava Tasker… Ele sempre ficava com o focus…

Pode até ser que sua janela consiga ficar sempre com o foco, mas as teclas não devem ser enviadas para a outra janela (o jogo)? Se sua janela estivesse com o foco ela que iria receber os eventos.