ActionListener x KeyListener  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Tenho um JFrame principal (tela inicial do aplicativo) que faz chamada às outras classes. Uma outra classe Calculadora (que é chamada da tela inicial) é tb um JFrame e é composta de botões que compõem o teclado da calculadora e têm suas funcionalidades escritas numa subclasse que implementa a ActionListener.

O problema é que agora inclui uma outra subclasse que implementa a KeyListener mas nada funciona via teclado.

Tentei incluir inicialmente apenas a função do KeyEvent dentro da subclasse que implementa a ActionListener e não funcionou pois precisei implementar o KeyListener no JFrame, só que fazendo isso tenho erro de compilação pois a classe Calculadora não é abstrata. Seu eu colocar ela como abstrata sou impedido de chamar ela pela tela principal pois a tela principal passa parâmetros para essa classe.

Alguém pode me dizer como devo estruturar o código para ter a funcionalidade dos botões e do teclado (de preferência sem precisar reescrever as funções já existentes na subclasse que implementa a ActionListener)?

Seguem trechos do código como está agora, ou seja, uma classe separada estendendo da classe KeyAdapter:




FredMP
JavaBaby
[Avatar]

Membro desde: 08/04/2006 19:46:24
Mensagens: 92
Localização: São Pedro da Aldeia - RJ
Offline

Cara, eu costumo fazer da seguinte forma: crio uma classe interna (não-anônima) chamada ControladorEventos e essa classe implementa todos os listeners que preciso no frame, dentro dessa classe eu faço o tratamento dos eventos, e os botões e demais componentes adicionar essa classe como ouvinte. Mais ou menos assim:





[Email] [MSN]
ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Prezado FredMP

Muito obrigado pela resposta!

Vou tentar aplicar desta forma.

Um Abraço,

ffranco
ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Prezado FredMP,

Tentei desta forma mas ainda não consigo usar o teclado.

Seguem os trechos de código:

1º) Exemplo de um dos botões (os demais estão da mesma forma);


2º) Classe dos Listeners inlcuindo uma das funções (entrada dos números);


Obrigado!

ffranco
ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Ah... me esqueci... tb inlcuí o trecho abaixo após os botões:



Valeu!!!

ffranco
ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Por favor, alguém pode me ajudar com isso?

Obrigado,

ffranco
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

Dá uma olhada, é um projeto do NetBeans versão 5.0
 Nome do arquivo Listeners.zip [Disk] Download
 Descrição Projeto usando os dois listeners ao mesmo tempo. Os Action estão registrados um para cada botão, e o key está registrado para o campo de texto e os botoes que chamam o método do campo de texto.
 Tamanho 11 Kbytes
 Baixado:  319 vez(es)


Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Prezado davidbuzzato,

Muito obrigado pela resposta, porém desta forma os Actions e os Keys ficam interdependentes. Além do mais, desta forma vou precisar reescrever toda a classe.

Meu objetivo é fazer os eventos trabalharem paralelamente, ou seja, os Actions tratam unicamente dos eventos dos botôes e os Keys unicamente dos eventos do teclado.

Vc sabe o que está impedindo o funcionamento no código acima?

Obrigado,

ffranco

ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Olá,

Alguém poderia me dar uma força com isso?

Obrigado,

ffranco
ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Pessoal,

Alguém pode tentar me ajudar com isso?

Obrigado,

ffranco
FredMP
JavaBaby
[Avatar]

Membro desde: 08/04/2006 19:46:24
Mensagens: 92
Localização: São Pedro da Aldeia - RJ
Offline

Opa! Só vi sua msg agora. Vou testar seu código e te passo um feedback assim que puder. Por hora, tente usar outros métodos da interface KeyListener (como o keyPressed) ao invés de usar o keyTyped.

att,
Fred
[Email] [MSN]
ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Valeu Fred!!!

Aguardo seu retorno.

Muito Obrigado,

ffranco
ffranco
Thread.start()

Membro desde: 02/09/2006 11:00:35
Mensagens: 29
Offline

Prezados Fred e demais amigos do GUJ,

Ainda estou sem solução para este problema.

Se alguém puder me ajudar vou ficar muito grato.

Um Abraço,

ffranco
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Já tentou, ao invés de usar um KeyListener, usar um ActionMap e um InputMap?

Talvez o problema que você esteja tendo é que o componente só recebe eventos de KeyStroke se tiver o foco.

Para associar ações a um KeyStroke, você primeiro precisa criar objetos da classe KeyStroke. A classe KeyStroke é uma classe de conveniência que encapsula a descrição de uma tecla. Para pegar um KeyStroke, ao invés do construtor, use um método estático getKeyStroke. Por exemplo, para o ctrl+b:


Ou, alternativamente:


Cada JComponent tem três input maps, cada um mapeando objetos associados para ações. Os três InputMaps representam cada um três condições diferentes, que são processadas nessa ordem.
1 - WHEN_FOCUSED: Quando o componente tem o foco, é a primeira a ser processada;
2 - WHEN_ANCESTOR_OF_FOCUSED_COMPONENT: Quando esse componente contém o componente que tem o foco;
3 - WHEN_IN_FOCUSED_WINDOW: Quando esse componente está na mesma janela que tem o foco.

Você obtém o InputMap de um componente chamando getInputMap, por exemplo:
InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);

Esse mapa será consultado apenas quando o componente tiver o foco do teclado. No caso da calculadora, você deveria usar, no painel que contém os botões, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT.

O problema é que o InputMap não mapeia objetos diretamente para o um Action. Para isso, você tem que usar uma segunda classe, a ActionMap. O código fica meio esquisitinho mas basicamente é assim:




[WWW]
MNalonS
Smalltalk
[Avatar]

Membro desde: 15/04/2011 00:17:21
Mensagens: 4
Offline

Como faço para associar uma ação à teclas que não sejam numéricas? qual string devo passar em KeyStroke.getKeyStroke(str) para associar a tecla * do teclado a uma ação?
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team