Seguinte… estou migrando uma aplicação que está escrita em vb e passando para java… nesta aplicação em vb tem uma função que se pressionado F1 em qualquer parte do Form(JFrame) ou qualquer controle que esteja o focus aparece um outro Form(JFrame)…
Qual o nome do evento que eu faço isso no JFrame?!
Em VB e Delphi isso é muito simples de fazer, basta colocar a propriedade KeyPreview = True. Isso faz com que a janela/form captura e trate os eventos de teclado antes dos componentes, mesmo estes estando com o foco. Procurei bastante aqui como fazer algo similar em java e ainda (espero que existe) não encontrei. Porém existe um bacalhau famoso em VB/Delphi para fazer isso e eu testei aqui em casa e dá pra fazer em java.
Vocêd vai criar um menu invisível, se a janela tiver menu visível melhor ainda. Neste menu um dos itens deve ter tecla de atalho/accelerator F1 (ou outra tecla) e pronto.
Faça o seguinte:
Crie um JMenuBar. Ele deve ser visible = true, porém o tamanho você coloca 0,0.
Dentro do JMenuBar crie um JMenu, este deve ser visible = false.
Dentro do JMenu crie um JMenuItem, no código você deve acrescentar um accelerator a este JMenuItem assim:
Pois é. Eu ainda estou procurando a forma de fazer o JFrame se apoderar dos eventos de teclado. Se funciona para um atalho de menu deve ter uma forma de fazer isso em código.
Não gostou da soluçao? :lol:
Dá uma boa procurada na documentação de JFrame, se achar uma forma de capturar teclas antes dos componentes me conta por que eu também vou precisar.
Acho que o post em questão só corrobora com o que dissemos: O JFrame não é capaz (acho) de interceptar eventos dos componentes como é feito no Delphi/VB(Windows).
JoaPaulo,
Não entendi como setFocusable(true); resolve ou ajuda. Na verdade se eu der setFocusable(false) para todos os componentes, então funciona, depois passo para true, mas isso é muito bizzarro. Da mesma forma poderia-se passar o KeyListener do JFRame para todos os componentes, também seria muito bizzarro.
Dennys,
Dar uma olhada na classe de Menu pode ser interessante, mas meu palpite é o seguinte: esse código deve estar na JFrame, na verdade, na classe Frame (AWT).
EURÉCA!!! A Solução era a vitamina de abacate!!! heheheehe
Estava eu aki pensando nesta madrugada tomando vitamina de abacate e perguntando ao google e consegui a resposta!!!
Agora é o seguinte… o KeyListener em JFrame só funciona se não tiver controle algum no JFrame e o código abaixo só funciona se tiver pelo menos um objeto( que tenha o poder de receber focus) no JFrame…
Boa!
Testei aqui e funcionou direitinho, porém na documentação consta que este método está obsoleto e deve ser trocado por outros dois. Eu não consegui fazer da outra forma, vou ler um pouco sobre a interface Action, pois acho que não estou fazendo algo.
Esta forma é bem melhor que aquele bacalhau do menu, porém eu não gostei desta parte do código:
Não gostei de ter que testar o string, talvez do outro modo (métodos mais recentes) não precise…
Se tiver novidades sobre a forma mais atual de implementar posta aqui…