Fazer tecla ativar uma ActionListener [RESOLVIDO]

3 respostas
Andre_Donadon

E aí galera beleza…

então… eu estou desenvolvendo uma calculadora pré-fix, meio que personalizada e estou com o seguinte problema:

se você vai com o mouse clicando nos botões dela, por enquanto, ela está fazendo tudo direito, parecido com a calculadora padrão do windows, agora eu queria começar a implementar as KeyListener para os botões para que você possa usar a parte númerica do teclado, tanto números, quanto operadores e o enter ( igual )… cada botão tem sua ActionListener e eu queria saber se tem jeito de chamá-la na KeyPressed

Por exemplo,

public class KeyIgual extends KeyAdapter {  
      public void keyPressed(KeyEvent evt) {  
         if (evt.getKeyCode() == KeyEvent.VK_ENTER) {  
               // BotIgual.doClick ( evt.getKeyCode() );
               /*
                * Como fazer para uma Key chamar uma ActionListener? 
                */
         }  
      }  
   }

já tentei algumas maneiras que encontrei na net mas por enquanto, nada funcionou…

Então pessoal… é basicamente isso que eu estou fazendo, eu sou meio complicado, não sei se está é a melhor maneira de se fazer isso, se algum tiver uma idéia melhor, eu agradeço!!!

mas por enquanto, como que eu posso resolver este problema??? lembrem-se, calculadora pré-fix semelhante a do Windows…

valeu galera… espero que vocês possam me ajudar, flw Abraço!!!

3 Respostas

L

Certamente sua classe principal extends JFrame...então faça assim

Action actionIgual = new AbstractAction() {
         public void actionPerformed(ActionEvent e) {
            seubotaoIgual.doClick();
         }
      };

KeyStroke stroke = KeyStroke.getKeyStroke( KeyEvent.VK_ENTER, 0 ); 

getRootPane().getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW ).put( stroke, seubotaoIgual);
getRootPane().getActionMap().put( pbigual, action1 );

ele vai funcionar (pelo menos é o que se espera) para os dois botões ENTER

Andre_Donadon

Fala LedRenan…

cara… valeu… funcionou!!!
mas ainda está acontecendo um pequeno problema…

por exemplo, quando eu aperto o número do teclado númerico ( numpad ), ele aparece duas vezes o mesmo número… até achei o motivo, mas não consegui consertá-lo…

a princípio eu fiz assim

Action actionUm = new ActionUm(){
     public void ActionPerformed( ActionEvent e ) {
          botaoUm.doClick();
     }
}

KeyStroke strokePlus = KeyStroke.getKeyStroke( KeyEvent.VK_NUMPAD1, 0 );
getRootPane().getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW ).put( strokePlus, botaoUm );
getRootPane().getActionMap().put( botaoUm, actionUm );

fiz umas alterações mas mesmo assim não funcionou… tentei reescrever o método doClick() para anular a action e pintar o botão, usando a mesma thread que o Java usa mas nem deu certo…

se você puder me dar uma força…

valeu Abraço!!!

Andre_Donadon

E ai LedRenan…

valeu, consegui decifrar meu problema…

quando você gera a Action de um botão… você faz assim:

// não usa mais a ActionListener e sim uma abstractAction...
private class ActionBotao extends AbstractAction /* implements ActionListener */ {}

daí quando você faz essa chamada, quando você aperta uma tecla, ela executa a action como se você estivesse clicando com o mouse…

Action action = new ActionBotao(){  
         public void ActionPerformed( ActionEvent e ) {  
              botao.doClick();  
         }  
    }  
      
    KeyStroke stroke = KeyStroke.getKeyStroke( KeyEvent.VK_NUMPAD1, 0 );  
    getRootPane().getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW ).put( stroke, botao );  
    getRootPane().getActionMap().put( botao, action );

o problema de estar colocando duas vezes o mesmo número era porque estava usando meu JNumberField… passei a usar um JLabel com aparência de TextField e funcionou perfeitamente.

Valeu!!!

Criado 14 de fevereiro de 2008
Ultima resposta 21 de fev. de 2008
Respostas 3
Participantes 2