KeyListener numa JApplet

Pessoal,

Estou colocando um KeyListener numa JApplet, aparentemente achei que estava correto, mas não está recuperando os eventos do teclado.

public class MinhaApplet extends JApplet implements KeyListener {

...

    public void init() {
             ...

            // adiciona a classe como listener de eventos do teclado.
    	    addKeyListener(this);
    	    
    	    // requisita foco            
            this.requestFocus();
      }
      ...

	public void keyPressed(KeyEvent e) {
	    System.out.println("K");
	}

	public void keyReleased(KeyEvent e) {
	    System.out.println("R");
	}

	public void keyTyped(KeyEvent e) {
	    System.out.println("T");
	}
}

O que pode estar faltando ou errado?

Valeu!

bom, meu conhecimento eh extremamente limitado, entao posso estar falando besteira, mas nao custa tentar…

aqui:

addKeyListener(this);

o certo nao seria:

algumacoisa.addKeyListener(this);

desculpa se falei besteira

Fiz uma outra classe de teste… e o que acontece agora é o seguinte, quando eu clico dentro, ai o teclado é cpturado, ou seja, recebe o focus e funciona, não to conseguindo agora fazer o focus ir automático, pra qdo iniciar já conseguir capturar o teclado.

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.JApplet;

public class Teste extends JApplet implements KeyListener {

    private static final long serialVersionUID = 1598859838481954927L;
    private JPanel jContentPane = null;

    public static void main(String[] args) {
	new Teste();
    }

    public Teste() {
	super();
    }

    public void init() {
	this.setSize(300, 200);
	this.setContentPane(getJContentPane());
	addKeyListener(this);
	this.requestFocus();
    }

    private JPanel getJContentPane() {
	if (jContentPane == null) {
	    jContentPane = new JPanel();
	    jContentPane.setLayout(new BorderLayout());
	}
	return jContentPane;
    }

    public void keyPressed(KeyEvent e) {
	System.out.println("P");
    }

    public void keyReleased(KeyEvent e) {
	System.out.println("R");
    }

    public void keyTyped(KeyEvent e) {
	System.out.println("T");
    }

    public boolean isFocusable() {
	return true;
    }

}

Eu faço assim


     seuComponente.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                      // codigo ação a ser realizada
                       
                    }
                });

Acho que e isso que vc precisa .

abraço

Cara ele não me da a opção de adicionar um ActionListener num objeto JPanel.
Imagina o seguinte, 4 JPanel, 1 deles ter o Listener pra pegar a tecla CTRL, ou a JApplet toda ter esse Listener.

Como axa que daria pra fazer isso?

Oi Luiz,

Não fiz o teste, mas tenta chamar setFocusable(true) antes de chamar o requestFocus().

Abraços,
Hugo.

havia feito este teste antes tbm, e o fiz novamente, mas tbm não “pega” o foco até clicar no JPanel.

Teria uma outra solução mais “bonita” pra esse caso? trocar JPanel por alguma coisa?

Oi Luiz,

Então temos que usar armamentos pesados agora.

Crie uma implementação para a interface KeyEventDispatcher e adicione ela como listener do KeyboardFocusManager:

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
  public boolean dispatchKeyEvent(KeyEvent e) {
    System.out.println("> " + e.getKeyChar());
    return false;
  }
});

Troque o System.out.println() pelo seu código e, por favor, avise-me se funcionou.

Abraços,
Hugo.

Pow Hugão… eu te amo cara !! hehehe :smiley:

Na mosca… funcinou perfeito… agora vou dar uma olhada no jacadoc pra ver como tratas os eventos de Pressed e Released.

Valeu cara! :slight_smile: