Galera, tenho esse código pro carro andar, e oque ocorre é que ele ta andando t udo certo sozinho (simplifiquei os metodos dos cases só pra dar uma idéia). Cada tecla que o usuário aperta ele vai para o lado correto sozinho, mas oque ocorre é que cada tecla ele cria uma nova Thread, entao se aperto pra ele ir pra cima ele vai na velocidade correta, mas se aperta direita ou para baixo, ele vai na direção correta só que mais rápido e vai ficando mais e mais rápido.
Será que tem como evitar que essa thread seja criada mais de uma vez? Alguém poderia me ajudar? Tentei singleton mas nao deu muito c erto, nao sei como poder no código a instancia com o run.
[code] public void andarCarro(int tecla) {
this.ultimaTecla = tecla;
System.out.println(“nova thread”);
Thread t = new Thread() {
@Override
public void run() {
while (ultimaTecla != 0) {
switch (ultimaTecla) {
case 37:
x - 1;
case 38:
x +1;
case 39:
y+1;
case 40:
y -1;
default:
return;
}
try {
Thread.sleep(300);
} catch (InterruptedException ex) {
Logger.getLogger(Controle.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
};
t.start();
}[/code]
// instancia os componentes
carro = new Carro();
painelCarro = new PainelCarro( carro );
threadCarro = new ThreadCarro( painelCarro, true );
// configura o frame
add( painelCarro, BorderLayout.CENTER );
setSize( 400, 400 );
setTitle( "Olha o Carro!" );
setVisible( true );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
addKeyListener( this );
// cria uma nova thread e a inicia
new Thread( threadCarro ).start();
Péraí, quem é que chama o método andarCarro() ? Se esse método já é executado a cada evento de tecla, então você não tem porquê de executar uma thread a cada vez que uma tecla é pressionada.
Já se você quer que ele mantenha o carro andando em uma determinada direção indefinidamente até alguém dar outro comando para mudar a direção, aí é melhor postar mais do código para tentarmos adaptá-lo.
O andarCarro() é executado por um keyListener que fica na JFrame principal.
O lance é que se o cara apertar pra frete o carro deve continuar andando pra frente até ele apertar pro lado ou pra trás, entende?
aí esse método que cada vez que o keylistner dispara o evento ele cria uma Thread e acho que é isso que está errado. Teria que criar a Thread no Jframe principal?