| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/10/2009 11:12:29
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/10/2009 11:29:55
|
AlissonGuj
JavaBaby
![[Avatar]](/images/avatar/1df9c0d719c7928c277ca723541ede7a.jpg)
Membro desde: 09/10/2009 20:17:40
Mensagens: 91
Offline
|
resolvido
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/10/2009 11:31:55
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/10/2009 11:40:39
|
AlissonGuj
JavaBaby
![[Avatar]](/images/avatar/1df9c0d719c7928c277ca723541ede7a.jpg)
Membro desde: 09/10/2009 20:17:40
Mensagens: 91
Offline
|
aham
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/10/2009 11:54:26
|
Ultralogic
JavaBaby
![[Avatar]](/images/avatar/6ec70e52e105bf01ba41639601076d5b.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/10/2009 11:58:05
|
gabrielmskate
Debugger
![[Avatar]](/images/avatar/34474dcb1ae25c15ec2439bc39eec736.jpg)
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/12/2009 12:57:31
|
ArchV
JavaTeenager
![[Avatar]](/images/avatar/905ffab81adcb238a16b7cef1369f93b.jpg)
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.
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2010 15:31:29
|
Naum Jefferson
Thread.start()
![[Avatar]](/images/avatar/b7358a182de49deaef3fb0300691c44f.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/03/2010 14:03:21
|
Hellmanss
JavaEvangelist
![[Avatar]](/images/avatar/0d9e6d7bba3347324616373b33e3bed9.jpg)
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 ..::
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/03/2010 14:18:08
|
UMC
GUJ Master
![[Avatar]](/images/avatar/1ec8093966ebb071c43adce47166569d.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/03/2010 14:19:23
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/07/2010 11:01:08
|
marcelot_
Smalltalk
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/08/2011 15:22:11
|
JDavidPimentel
Smalltalk
Membro desde: 19/08/2011 14:43:11
Mensagens: 1
Offline
|
Este tópico realmente foi muito esclarecedor. Parabéns Vini.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2012 14:25:14
|
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2012 13:18:03
|
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...
|
| Nome do arquivo |
letras.jpg |
Download
|
| Descrição |
Frame da aplicação |
| Tamanho |
12 Kbytes
|
| Baixado: |
6 vez(es) |
|
|
|
 |
|
|