KeyListener em JFrame

6 respostas
Lukas0145

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?

6 Respostas

fabim

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");
        }
    });
Lukas0145
fabim:
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");
        }
    });

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.

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

Lukas0145

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

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

fabim

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");
ViniGodoy

Melhor ainda:

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

Criado 3 de julho de 2013
Ultima resposta 3 de jul. de 2013
Respostas 6
Participantes 3