Dúvida - ActionMap e InputMap

quase morri tentando entender os posts sobre ActionMap e InputMap, preciso de um exemplo prático!

Meu maior problema no projeto do trabalho é o seguinte:

Para cada tela swing, eu preciso fazer um addKeyListener para cada componente, para assim funcionar os atalhos do programa: f1, f2, f3, esc, etc. E pior que isso, este controlador faz algo do tipo:

se (tecla_pressionada == f1) faz isso senao se (tecla_pressionada == f2) faz aquilo...

muito chato!

Mas, acredito que estes Maps, resolveriam meu problema, porém, não consegui implementar.
Alguém poderia dar um exemplo mais claro?

Num contexto simples de alta abstracao, que bastasse eu fazer:

botao1.addAction("quando apertarem f1, voce vai executar tal metodo)

Obrigado! :slight_smile:

Com o ActionMap e o InputMap, você realmente não vai precisar registrar um listener para cada componente, a menos que a função das teclas F1, F2, F3, etc… mudem de componente para componente.

Não tem muito segredo.

  1. Pegue o input map do painel onde os componentes estão:
  1. Adicione a esse input map, a tecla que será pressionada e o nome da ação que essa tecla dispara. Esse nome da ação é escolhido livremente por você e deve ser único para cada ação:

imap.put(KeyStroke.getKeyStroke("F1"), "panel.buttonF1press"); imap.put(KeyStroke.getKeyStroke("F2"), "panel.buttonF1press"); imap.put(KeyStroke.getKeyStroke("F3"), "panel.buttonF1press");

  1. Obtenha o ActionMap do seu painel onde os componentes estão:
  1. Mapeie os nomes de ação (aqueles, fornecidos na string ali de cima), para as ações em si:

amap.put("panel.buttonF1press", new HelpAction()); amap.put("panel.buttonF2press", new SaveAction()); amap.put("panel.buttonF3press", new ClearAction());
Você pode fazer isso no construtor do seu JFrame, logo após criar os componentes.

Essas ações são objetos filhos de AbstractAction. Você pode até mesmo reaproveitar essas ações para menus e botões, assim não fica só dependendo das teclas de atalho.

Há um exemplo nos códigos do Core Java, capítulo 8:
http://horstmann.com/corejava/corejava7.zip

Dê uma olhada. Tem um JPanel com 3 botões de cores. E eles mudam a cor do painel.
O exemplo chama-se ActionTest.

By the way, você já olhou esse tópico?

Genial! Agora sim viny! Funcionou perfeitamente. Meus parabéns, muito obrigado… sem palavras para lhe agradecer.

Uma ultima dúvida: Tem como eu fazer isso para o JFrame completo, ao invés de adicionar painel por painel?

um forte abraço!

Outra duvida, hehehe!! Foi mal…

mas… como eu poderia programar as teclas:

up, down para mapear os focus dos componentes, por ex:

apertasse em up: ele focava no componente de cima
em down: no componente de baixo

como se fosse uma navegação entre os widgets (como o tab funciona, mas só faz o trabalho de IDA (não volta))

valeu novamente galera!

A volta é feita por shift+tab.

Putz… mudar foco já é um pouco mais complicado… as poucas vezes que eu mexi nisso, só tive problemas. Resolvi então me manter no comportamento padrão do Java… dessa vez não vou poder te ajudar… :frowning:

Crie um tópico específico para o assunto do foco. Deve ter gente no GUJ que poderá ajuda-lo.

Para registrar o ActionMap e KeyMap para todo mundo, use o do RootPane.

Bah, então estou frito! rs…

mas será que foge da idéia dos maps, ou entram outras classes auxiliares para este assunto?

No mais, muito obrigado novamente.

Tem outras classes para o assunto.

Vinny, hauahua… vou te enxer pela ultima vez (hoje)

Existe alguma idéia, para fazer praticamente essa nossa ai, do keyStroke… mas para o mouse…

tipo, para mim, digamos, apenas adicionar um handler a determinado painel, ao inves de adicionar pra cada widget…

algo do tipo:

[code]addHandler(painel,new MyClassHandler());

MyClassHandler extends AbstractAlgumaCoisa {
void metodoQuePoderiaExistir(KeyEvent e) {
if (e.getSource() == nomeDeTalComponenteDoPainel) {
tal tal tal…
}
}
}
[/code]

abraçao

Nunca ouvi falar… realmente não sei.

Boa tarde ViniGodoy
você poderia me ajudar em codigo que não consigo resolver?