Executar ação on key press, sem addKeyListener em cada componente

9 respostas
S

no delphi, qdo eu seto o onkeypress do Form, isso faz com q , nao importa qual componente esteja focado,
ele executa determinada ação
como eu faria isso em java?
sem setar add um keyListener em cada componente de um JFrame, ou JINternalFrame?

9 Respostas

E

Normalmente em Swing não se usa um keyListener - como você viu, ele trata eventos de nível muito baixo, e não consegue tratar as teclas TAB e ENTER, que são tratadas antes de passar ao KeyListener.

Para teclas de função ou ESC (que devem funcionar não importando em que componente o foco está) use um “key binding”:

http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

S

era exatamente isso q eu procurava, voce pode passar um exemplozin?
tipo, eu add isso

component.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),
                            "pressed");
component.getInputMap().put(KeyStroke.getKeyStroke("released SPACE"),
                            "released");

onde exatamente? no JFrame?
esse componet, seria meu JFrame?

S

duas funcionalidades q eu fiz, se servir pra alguem

fecha o forumario ao pressionar ESC

Action doEscape = new AbstractAction() {
            public void actionPerformed(ActionEvent e)
            {
                close();
            }
        };
        
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
                            "doEscape");
        
        this.getActionMap().put("doEscape", doEscape);

trocar tab por enter
obs. eu usava o setFocusTraversalKeys, mas qdo pressionava ENTER em cima de um JButton, ele nao acionava o botao, somente pulava o campo
usando esse eskema ai fico legal paca

Action doEnterKeyPress = new AbstractAction() {
            public void actionPerformed(ActionEvent e)
            {
                KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner().transferFocus();
            }
        };
        
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released ENTER"),
                            "doEnter");
        
        this.getActionMap().put("doEnter", doEnterKeyPress);
R

Opa, eai pessoal! Então, eu também to passando por umas dificuldades com KeyBindings… Eu segui os passos do amigo Shinoob, e consegui fazer KeyBinds, porém se eu utilizar outro componente qualquer, as keybinds vão para o espaço, já tentei “rechamar” o método, mas também não adiantou. Grato pela ajuda!

EDIT1: Consegui resolver, faltou eu botar “WHEN_IN_FOCUSED_WINDOW” Desculpem o transtorno…

EDIT2: Aproveitando o post para perguntar outra coisa que não consegui no Google nem na API… Como faço para que o “focus” caminhe sobre os botões? Exemplo: No Desktop do PC vc pode dar TAB e mover a seleção com as setas direcionais, tem como fazer isto na minha aplicação? Grato pela ajuda!

E

http://www.guj.com.br/java/92862-tecla-enter-no-jtextfield-#497384

R

Grato pela sua resposta Entanglement! Mas este link não é bem o que eu queria, eu queria fazer o meu programa navegável através das setas de navegação, pelo que intendi, o link que vc me passou apenas ensina a substituir o tab por outra tecla. Se alguém tiver alguma maneira de me ajudar eu agradeço.

E

Você viu o link exato? Ele diz:

R

entanglement:
Você viu o link exato? Ele diz:…

Salve Entanglement! Então cara, eu vi sim, mas o problema em questão, é que eu nem sequer consigo navegar nos componentes do meu GUI, o método para fazer a ação sobre o “focus” não é o problema, o meu problema é a navegação mesmo… Grato a qualquer ajuda!

Edit: Desculpe Entanglement, não prestei atenção no código do link q vc me passou… Esta tudo lá. Grato pela sua ajuda!

L

shinoob, vc encontrou a solução para um problemão que eu tinha aqui faz tempo, valeu brow !

Criado 19 de outubro de 2011
Ultima resposta 26 de mar. de 2013
Respostas 9
Participantes 4