KeyListener JPanel, Focus. [RESOLVIDO]

5 respostas
ArchV

Olá.
Um JPanel quando é adicionado em um JFrame não fica em foco. Portanto se ele implements a interface KeyListener ele não irá responder devido ao foco.
No entanto, pesquisando na API eu olhei os métodos de sua classe ancestral JComponent , grabFocus() usei tb o requestFocus() e o KeyListener continuava não respondendo.
Eu aprendi a resolver este problema usando AbstractAction através de um tutorial do ViniGodoy, mas, agora quero saber porque o componente não fica em foco se eu estou utilizando os métodos que “chamam o focus” para este.

vlw.

5 Respostas

ViniGodoy

Por padrão, os paineis não são “focusables”. Se eu não me engano, nem sequer é capaz de chamar “setFocusable(true)” para eles.

ArchV

ViniGodoy, fiz o seguinte. tenho um JPanel add em um JFrame e chamei os seguintes métodos (tal como eu disse é o JPanel que implements KeyListener):

// painel é referencia de JPanel
        painel.setFocusable(true);
        painel.requestFocus();
        painel.grabFocus();

Comecei apertar a tecla do evento e não acontecia nada, No entanto, na ultima tentativa, cliquei na área do painel e ele começou a responder o KeyListener. Será que realmente não tem como settar o focus dele sem ter que fazer este clique? (apenas curiosidade) Porque se eu realmente precisar usar evento em JPanel irei usar AbstractAction.
Se alguém já conseguiu essa proeza faça o favor de relatar aqui.

Vlw.

ViniGodoy

Só um coisa, só é possível chamar requestFocus() em componentes visíveis. Por isso, não adiantaria colocar esse foco no seu construtor, por exemplo.

E, melhor que chamar o requestFocus() é chamar requestFocusInWindow().

M

Talvez fazer a chamada de requestFocusInWindow() dentro de um Runnable executado pelo SwingUtilities.invokeLater resolva (talvez…).

ArchV

ViniGodoy:
Só um coisa, só é possível chamar requestFocus() em componentes visíveis. Por isso, não adiantaria colocar esse foco no seu construtor, por exemplo.

E, melhor que chamar o requestFocus() é chamar requestFocusInWindow().

Deu certo, que legal agora não vou precisar usar AbstractAction no futuro projeto que eu vou desenvolver. :smiley:

marcobiscaro2112 e ViniGodoy vlw ae.

Criado 29 de janeiro de 2010
Ultima resposta 29 de jan. de 2010
Respostas 5
Participantes 3