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.
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.
[quote=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().[/quote]
Deu certo, que legal agora não vou precisar usar AbstractAction no futuro projeto que eu vou desenvolver.