Limpar buffer do teclado

Eu to com um problema num programa que eu to fazendo. eh o seguinte, o programa eh baseado em eventos, ou seja ele so vai faze alguma coisa se for precionada alguma tecla ou houver um click, so que se uma tecla ficar precionada por muito tempo o programa fica um tempao executando, mesmo se ja foi soltado a tecla, entao eu queria saber uma forma de limpar o buffer quando termina de executa, para executar somente quando for precionada uma tecla e somente uma vez.

Se alguem puder me ajudar, eu agradeço

Não é mais fácil realizar a ação quando a tecla é solta e não pressionada?

acho que nao… O que eu preciso, eh faze ele executa enquanto a tecla estiver pressionada, por exemplo fazer uma movimentaçao de algum objeto qualquer na tela, eu quero que esse objeto se mova para os lado somente enquanto alguma seta do teclado estiver pressionada, e quando eu solta a seta ele para.
Soh que como o buffer esta cheio, o objeto vai fica andando ate esvaziar o buffer.
Como eu podeira fazer isso?

Entendi o problema.

Estava “brincando de fazer joguinhos” aqui e precisei implementar algo semelhante. Para o moviento ficar mais suave implementei algumas flags:

// etc
this.addKeyListener( new KeyAdapter() {
	public void keyPressed( KeyEvent e ) {
		handleKeys( e.getKeyCode(), true );
	}
	public void keyReleased( KeyEvent e ) {
		handleKeys( e.getKeyCode(), false );
	}
} );
// etc
private boolean goingUp = false;
private boolean goingDown = false;
private boolean goingLeft = false;
private boolean goingRight = false;

private void handleKeys( int keyCode, boolean pressed ) {

	if( keyCode == KeyEvent.VK_UP )
		goingUp = pressed;
	else if( keyCode == KeyEvent.VK_DOWN )
		goingDown = pressed;
	else if( keyCode == KeyEvent.VK_LEFT )
		goingLeft = pressed;
	else if( keyCode == KeyEvent.VK_RIGHT )
		goingRight = pressed;
}

private void moveBall() {
	if( goingUp )
		ball.move( Ball.UP );
	else if( goingDown )
		ball.move( Ball.DOWN );
	if( goingLeft )
		ball.move( Ball.LEFT );
	else if( goingRight )
		ball.move( Ball.RIGHT );
}

E moveBall() é chamado ininterruptamente por outra thread.

acho que entendi. Voce criou essas flags de controle, e quando o keyPressed() eh chamado a flag e setada pra true e quanto o keyReleased for chamado a flag volta pra false.

Vo tenta faze isso aki, valeu.

Exatamente :smiley: esqueci de comentar o código, desculpe.

consegui, fiz algumas coisa aki parecido isso que vc passo e funcionou, valeu.