Como acionar os botões de uma calculadora através do teclado  XML
Índice dos Fóruns » Interface Gráfica
Autor Mensagem
ViniGodoy
Moderador
[Avatar]

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

Um dos exercícios favoritos de vários professores de Java é pedir para o aluno criar uma calculadora. Tudo vai bem, até que o aluno resolve fazer com que os botões sejam automaticamente acionados pelo teclado. Então, o inferno começa.

Por que? Simplesmente, porque o local adequado para tratar esse tipo de evento não é nos KeyListeners, que provavelmente foram ensinados em sala de aula. Um keylistener só trata a ação de tecla no componente onde foi pressionado, logo, seria necessário incluir keylisteners de todas as teclas, em todos os componentes, o que não é nada prático.

Então, qual seria o local certo? Como dizer para o Java tratar teclas que foram pressionadas "no geral"?

Todo componente Swing tem associado a ele dois mapas. O InputMap e o ActionMap. O InputMap associa uma tecla a um nome, enquanto o ActionMap associa esse nome a uma ação. Os componentes tem três tipos de InputMaps:
1. WHEN_IN_FOCUSED_WINDOW: Dispara sempre que a tecla é pressionada quando a janela estiver em foco. Não importa se sobre o componente ou não.
2. WHEN_FOCUSED: Dispara quando a tecla foi pressionada no momento em que o componente estava em foco;
3. WHEN_ANCESTOR_OF_FOCUSED_COMPONENT: Dispara quando uma tecla foi pressionada no ancestral imediato do componente, geralmente, o painel onde o componente está.

No caso da calculadora, nos interessa o primeiro caso.

O código abaixo, cria um painel, tipico de todas as aplicações de calculadora, e associa a esse painel os botões de 0 até 9.
Para cada botão é criada uma ação, correspondente ao pressionar de sua tecla. Essa ação é associada primeiramente ao próprio botão, pois será disparada também quando o botão for clicado.

Depois, criamos um apelido para cada ação no painel principal da calculadora. E, então, associamos esse apelido ao pressionar das teclas 0 até 9, tanto do teclado principal, quanto do teclado numérico. Como a ação será disparada sempre que a janela estiver em foco, usamos para isso o InputMap WHEN_IN_FOCUSED_WINDOW.

Os demais botões foram deixados sem função. Desculpe decepcionar quem veio aqui em busca da solução completa desse exercício, mas a idéia desse tópico foi simplesmente fazer com que os alunos dedicados parem de perder suas noites de sono nessa funcionalidade e não resolver o problema da calculadora em si.

O ActionMap e o InputMap também são ideais para registrar eventos em jogos.



Obviamente, muito código poderá ser reduzido usando a instrução for. Mas preferi deixar de maneira mais explícita, por ser mais didático.

This message was edited 2 times. Last update was at 10/10/2009 11:27:10


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
AlissonGuj
JavaBaby
[Avatar]

Membro desde: 09/10/2009 20:17:40
Mensagens: 91
Offline

resolvido
ViniGodoy
Moderador
[Avatar]

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

Na verdade, isso já foi tão perguntado aqui no GUJ, que resolvi criar esse tópico e adicionar aos meus favoritos.
Agora já tenho um local para linkar quando a dúvida surgir no futuro (e vai surgir).

This message was edited 1 time. Last update was at 10/10/2009 11:32:08


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
AlissonGuj
JavaBaby
[Avatar]

Membro desde: 09/10/2009 20:17:40
Mensagens: 91
Offline

aham
Ultralogic
JavaBaby
[Avatar]

Membro desde: 31/07/2008 16:55:47
Mensagens: 76
Localização: Jba
Offline

Pode crer parcero
Bom, obrigado por sua ajuda
ate mais
Flwww

(Ultralogic) rAmOn
[WWW] [MSN]
gabrielmskate
Debugger
[Avatar]

Membro desde: 10/10/2008 09:12:34
Mensagens: 63
Localização: Santos - SP
Offline

Esse post deveria passar para os Artigos!!!
Muito bom.

Gabriel Rubens -
http://grupohaw.com.br/


Oracle Certified Java Programmer

Você vai tropeçar várias vezes, vai se perguntar "Por que estou fazendo isto?", vai ter recaídas que o farão se sentir um fracassado, mas olhar para trás depois e ver o quanto você subiu da montanha, só te fará querer o TOPO.
[Email] [WWW] [MSN]
ArchV
JavaTeenager
[Avatar]

Membro desde: 07/09/2009 20:59:07
Mensagens: 175
Localização: Curitiba
Offline

gabrielmskate wrote:Esse post deveria passar para os Artigos!!!
Muito bom.


Concordo.

Este tópico já me ajudou muito.

[]
ArchV.

Naum Jefferson
Thread.start()
[Avatar]

Membro desde: 30/05/2009 22:20:44
Mensagens: 31
Localização: Paulista / PE
Offline

ArchV wrote:
gabrielmskate wrote:Esse post deveria passar para os Artigos!!!
Muito bom.


Concordo.

Este tópico já me ajudou muito.


Concordo[2].

*** Naum Jefferson ***
Estudante de Sistemas de Informação
[Email] [MSN]
Hellmanss
JavaEvangelist
[Avatar]

Membro desde: 22/04/2009 16:02:06
Mensagens: 336
Localização: Indaial/Blumenau
Offline

Vini, seguindo os seus artigos no Ponto V, implementei os exemplos propostos e em cima dos mesmos começei a fazer alterações e cheguei em um ponto parecido...

Para implementar eventos de teclas apertadas simultaneamente, esse método que você implementou acima resolve?


::.. SUN CERTIFIED JAVA PROGRAMMER 5 ..::
[MSN]
UMC
GUJ Master
[Avatar]

Membro desde: 09/04/2009 14:03:36
Mensagens: 1685
Localização: Feira de Santana - BA
Offline

Boa Viny!
Parabéns!
D+

vlw

Compro o livro SCJP 6 Kathy Sierra, de preferência e português, quem tiver manda MP.!!!

umcaste.com

Graduando em Sistema de Informação.

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico. (créditos maior_abandonado)

UMC-ASTEC -> Recomenda o NEXT!
O Next, é um framework para desenvolvimento de aplicações JEE. Baseado em Spring e Hibernate, tem como foco facilitar o trabalho do programador e dar produtividade ao desenvolvimento de aplicações web. Conta com diversos recursos que irão turbinar o desenvolvimento de suas aplicações.
(Créditos Rogel Garcia)

Download do NEXT


Quer aprender a programar com facilidade!?

Aqui





[WWW]
ViniGodoy
Moderador
[Avatar]

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

Hellmanss wrote:Vini, seguindo os seus artigos no Ponto V, implementei os exemplos propostos e em cima dos mesmos começei a fazer alterações e cheguei em um ponto parecido...

Para implementar eventos de teclas apertadas simultaneamente, esse método que você implementou acima resolve?




No caso de jogos, você precisa tratar os eventos de KeyDown e KeyUp mesmo. Até pq geralmente vc precisa saber que essas teclas se mantiveram pressionadas.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
marcelot_
Smalltalk
[Avatar]
Membro desde: 17/02/2010 17:38:57
Mensagens: 3
Localização: Novo Hamburgo
Offline

Muito bom o post.
Me ajudou. Funciona certinho. Visitei este exemplo tb: http://www.daniweb.com/forums/thread125682.html, funciona certinho.
Mas tenho a seguinte dificuldade. Se eu usar o NetBenas para gerar o código automaticamente, como posso adicionar um listener no meu formulario? Tentei colocar o evento keyPressed, keyTyped, keyReleased direto no código e também colocar os eventos de forma visual pelas propriedades do formulário, dai ele cria: formKeyReleased, formKeyPressed e formKeyTyped, mas nenhum deles funciona. Preciso que quando o usuario clique no botão chame uma função. Por enquanto estou apenas tentando fazer aparecer uma menssagem na tela, usando JOptionPane.showMessageDialog.

This message was edited 2 times. Last update was at 03/09/2010 08:45:45


PC->Cosmos 1000/Q6600 2.4GHz@3.6GHz/Asus Maximus Formula/9800GTX+ 738MHz Mem 1100MHz/2GB Corsair Dominator 1066MHz DDR2/250GB SATAII/Razer Copperhead/LCD 19 2ms WideScreen Seven/Ubuntu9.4
Note->MacBook 2.4MHz T8300/GMA x3100/Memory 2GB 667MHz/HD 160GB/13.3" Mac OS 10.5.7/XP SP3/Dedian 2.6.26 lenny3
[WWW] [MSN]
JDavidPimentel
Smalltalk

Membro desde: 19/08/2011 14:43:11
Mensagens: 1
Offline

Este tópico realmente foi muito esclarecedor. Parabéns Vini.
leorocco
Smalltalk

Membro desde: 15/02/2012 20:38:59
Mensagens: 1
Offline

colega, e se eu usar ao inves de um JPanel, um JFrame?
ewerluis
Smalltalk

Membro desde: 26/04/2012 12:48:06
Mensagens: 1
Offline

Olá! Gostaria de ajuda no seguinte problema.

Tenho um JFrame com 4 JButton nomeados de A, B, C e D respectivamente, e um JLabel nomeado de status.

Quero que cada JButton possa setar um texto no JLabel. Até ai tudo bem, já fiz isso.
No caso, ao clicar em A o texto do JLabel muda para "A" e assim sucessivamente.

Agora preciso que cada JButton responda a sua respectiva letra do teclado.
Exemplo: Ao pressionar a tecla C, o JLabel mude para "C". Ao pressionar a tecla A, o JLabel mude para "A". Sem que o foco esteja sobre o JButton correspondente.

Desde já, agradeço pela ajuda.
No aguardo...
[Thumb - letras.jpg]
 Nome do arquivo letras.jpg [Disk] Download
 Descrição Frame da aplicação
 Tamanho 12 Kbytes
 Baixado:  6 vez(es)

 
Índice dos Fóruns » Interface Gráfica
Ir para:   
Powered by JForum 2.1.8 © JForum Team