JFrame e KeyListener

5 respostas
E

Pessoal, estou com uma subclasse de JFrame, AplicacaoCliente, que precisa receber eventos do teclado…tentei usar o método addKeyListener sobre o próprio AplicacaoCliente (que implementa KeyListener), mas o método keyPressed nunca é chamado.

Também já tentei usar o addKeyListener em um painel dentro do frame, sem sucesso…me parece que o frame e o painel nunca obtém o foco para “ouvir” o evento…então não sei o que fazer!

Alguém já viu uma solução boa para esse problema?

Brigadão =]

5 Respostas

luiz_ross

Coloca o trecho de código que esta dando problema aki pra nos vermos, e quais mensagens de erro que aparecem

E

Não dá mensagem de erro nenhum, parece que é exatamente isso que o New_Radical disse: o JFrame ou JPanel não recebem foco, e por isso não ouvem nada…o código é o seguinte: (o código está feio pq é um estudo hehe)

public AplicacaoCliente (Jogador [] jogadores, int j) {
		setSize(400,400);
		setTitle("Teste de animação");
		
		// guarda referência para o jogador da aplicação
		jogador = jogadores[j];
		
		// cria temporizador
		timer = new Timer(33,this);
		
		// cria painel onde o tabuleiro será desenhado
		pintor = new Pintor(new Tabuleiro(jogadores));
		addKeyListener(this);
		
		// ...código de teste...
		
		// adiciona elementos ao frame
		getContentPane().setLayout(new BorderLayout());
		
		getContentPane().add(pintor,BorderLayout.CENTER);		
		
		addKeyListener(this);
		
		timer.start();
	}

o método keyTyped segue abaixo, embora ele nem chegue a ser chamado:

public void keyTyped(KeyEvent evt) {
		Movimento mov = null;
		if (evt.getKeyCode() == KeyEvent.VK_UP) {
			mov = new Movimento(5,jogador,0,-30); 
		}
		else if (evt.getKeyCode() == KeyEvent.VK_DOWN) {
			mov = new Movimento(5,jogador,0,30);
		}
		else if (evt.getKeyCode() == KeyEvent.VK_LEFT) {
			mov = new Movimento(5,jogador,-30,0);
		}
		else if (evt.getKeyCode() == KeyEvent.VK_RIGHT) {
			mov = new Movimento(5,jogador,30,0);
		}

		if (mov != null)
			pintor.incluiMovimento(mov);		
	}

Com botões os movimentos funcionam perfeitamente, só que os eventos de teclado não funcionam…como na interface final eu não pretendo ter botões, quero poder tirar esses botões e “linkar” os eventos de teclado ao frame (AplicacaoCliente) ou ao painel (Pintor).

E

Consegui fazer funcionar aqui!! :smiley:

O código tinha um erro, já que eu usava o método keyTyped ao invés de keyPressed, e pro que eu quero não funciona mesmo…e além desse erro, pra fazer um JFrame obter o foco, basta re-implementar o método isFocusable, herdado de Component…ficou assim:

public boolean isFocusable () { return true; }

Tentei usar o método isFocusTrasversable, aí descobri q ele era deprecated e esse o substitui…

Não testei com JPanel, mas acredito que funcione da mesma forma, já que assim permite-se que o foco seja obtido para qualquer componente desejado…

[]'s e obrigado pela discussão

N

Também ja tive está duvida.
E não consegui fazer com que o JPanel ou o JFrame aceitasse os eventos do teclado.

:confused:

N

Não aparece mensagem de erro.
O que acontece é que o focus nunca vai para esses componentes, pelo menos é o que está parecendo.

Ainda coloquei um requestFocus() mas ainda sim não ocorreu o keyPressed.

Criado 22 de agosto de 2003
Ultima resposta 22 de ago. de 2003
Respostas 5
Participantes 3