KeyListener em JFrame

Tenho uma janela em JFrame que preciso saber quando o usuário teclar ‘1’. Fiz o seguinte e não funcionou:


frmFlexPontual.getContentPane().addKeyListener(new KeyAdapater(){
public void keyPressed (KeyEvent e) {
if (e.getKeyCode()==KeyEvent.VK_1){
System.out.println("1 Pressionado!");
}}
});

Alguém sabe o pq de não funcionar?

Provavelmente é mais um problema de FOCO, do que de KeyListener em si (Swing tem dessas coisas).
Tenta o seguinte:


getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
      KeyStroke.getKeyStroke("1"), "myAction");
    
    getRootPane().getActionMap().put("myAction", new AbstractAction() {
        public void actionPerformed(java.awt.event.ActionEvent e) {
            System.out.println("Funfou");
        }
    });

[quote=fabim]Provavelmente é mais um problema de FOCO, do que de KeyListener em si (Swing tem dessas coisas).
Tenta o seguinte:

[code]

getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(“1”), “myAction”);

getRootPane().getActionMap().put("myAction", new AbstractAction() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
        System.out.println("Funfou");
    }
});

[/code][/quote]

Funcionou sim, mas ficou meio confuso pra mim. E outra, ele só funciona se o “1” for o qual está ao lado do ", o “1” do teclado do NumLock não funciona.

A quesão é que o KeyListener que foi adicionado a um objeto (no seu caso no frame) só será disparado se o FOCO estiver nesse componente.
Dai vc pensa uqe o foco ta no frame mas as vezes nao ta, ta numa label, num contentPane sei la em algum lugar que nao é onde vc adicionou o listener.

Desse jeito ai é feito com InputMap, da uma googlada e vc vai entender a diferença

[quote=fabim]A quesão é que o KeyListener que foi adicionado a um objeto (no seu caso no frame) só será disparado se o FOCO estiver nesse componente.
Dai vc pensa uqe o foco ta no frame mas as vezes nao ta, ta numa label, num contentPane sei la em algum lugar que nao é onde vc adicionou o listener.

Desse jeito ai é feito com InputMap, da uma googlada e vc vai entender a diferença[/quote]

Certo, e quanto a tecla ‘1’? Você sabe o pq?

O KeyCode do “1” do teclado numerico nao é o mesmo do “1” normal. Acho que é 97 o codigo.

Talvez vc vai te que adicionar a mesma action pro 97


getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(  
      KeyStroke.getKeyStroke("97"), "myAction");  

Melhor ainda:

getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1), "myAction");