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?!
Vc pode implementar junto tbem Focus e Mouse tbem…
C
cv1
Carioca, ele ja fez isso
Dennys, cara, nao sei eu achava que colocando no container pai-de-todos dava certo
D
dsiviotti
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.
D
Dennys
hum…
Alguém já passou por isso?!?!?
D
dsiviotti
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.
D
Dennys
rs*** :lol:
É uma saida… mas não gosto de fazer esse tipo de coisa… evito no máximo… se encontrar algo dou um post aki…
vou lá conversar com meu amigo google… rs***
:arrow: Ah! E se alguém souber dá um grito!!! please!!!
Fuizi!Valeu!!!
J
Jair_Rillo_Junior
eu não sou muito fã de Swing e nem trabalho com isso, mas dei uma pesquisada no fórum do GUJ e achei esse tópico
Se der uma fuçadinha na classe KeyEvent ou na própria classe que faz o Menu… e montar uma classe nossa ai dá parar fazer?
Ou eu tô viajando no kiabo? :oops:
Não gosto de fazer GanbiArte rs***
Valeus!
J
JoaoPaulo
Tem uma maneira que sempre uso:
chamar setFocusable(true); :lol:
D
dsiviotti
Manchester,
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).
Vou dar uma olhada…
D
Dennys
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…
importjava.awt.event.*;importjavax.swing.*;publicclassJFramePrincipalextendsJFrameimplementsActionListener{privatejavax.swing.JButtonjButton=null;publicJFramePrincipal(){super();initialize();KeyStrokeEscape=KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0);JRootPanerootPane=getRootPane();rootPane.registerKeyboardAction(this,"Escape",Escape,JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);setSize(200,200);}/** * This method initializes this * * @return void */privatevoidinitialize(){this.setContentPane(getJButton());}publicvoidactionPerformed(ActionEventevt){Stringaccion=evt.getActionCommand();System.out.println("A: "+accion);if(accion.equals("Escape")){dispose();System.exit(0);}}/** * This method initializes jButton * * @return javax.swing.JButton */privatejavax.swing.JButtongetJButton(){if(jButton==null){jButton=newjavax.swing.JButton();}returnjButton;}}
O Código tá meio sujo mas dá para ter uma idéia…
E VIVA A VITAMINA DE ABACATE!!! :lol:
D
dsiviotti
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…
D
dsiviotti
Acho que acertei como usar os métodos “getInputMap()” e “getActionMap()” que a documentação recomenda. O exemplo abaixo funcionou para as teclas F1 e F2, F1 com esses dois métodos recomendados e F2 com o antigo.
/* * Created on 24/02/2004 */packagebr.pro.douglas.teste;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyEvent;importjavax.swing.AbstractAction;importjavax.swing.Action;importjavax.swing.JComponent;importjavax.swing.JFrame;importjavax.swing.JRootPane;importjavax.swing.KeyStroke;/** * @author Douglas Siviotti */publicclassJFrameCaptureKeysextendsJFrameimplementsActionListener{publicstaticvoidmain(String[]args){JFrameCaptureKeysapp=newJFrameCaptureKeys();app.setVisible(true);}privatefinalStringcommandF1="F1";privatefinalStringcommandF2="F2";privatejavax.swing.JPaneljContentPane=null;privatejavax.swing.JTextFieldjTextField=null;privateActionpressF1;/** * This is the default constructor */publicJFrameCaptureKeys(){super();/* Cria uma Action para quando pressionar F1 */pressF1=newAbstractAction(commandF1){publicvoidactionPerformed(ActionEvente){System.out.println("F1 pressionado");}};/* Guarda a condição - sem isso não funciona */intcond=JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT;/* Cria KeyStrokes para F1 e F2 */KeyStrokef1=KeyStroke.getKeyStroke(KeyEvent.VK_F1,0);KeyStrokef2=KeyStroke.getKeyStroke(KeyEvent.VK_F2,0);/* Guarda o RootPane */JRootPanerootPane=getRootPane();/* Modo obsoleto */rootPane.registerKeyboardAction(this,commandF2,f2,cond);/* Modo recomendado */rootPane.getInputMap(cond).put(f1,commandF1);rootPane.getActionMap().put(commandF1,pressF1);/* Inicialização da JFrame */initialize();}publicvoidactionPerformed(ActionEvente){Stringkey=e.getActionCommand();if(key.equals(commandF2))System.out.println("F2");}/** * This method initializes jContentPane * * @return javax.swing.JPanel */privatejavax.swing.JPanelgetJContentPane(){if(jContentPane==null){jContentPane=newjavax.swing.JPanel();jContentPane.setLayout(newjava.awt.BorderLayout());jContentPane.add(getJTextField(),java.awt.BorderLayout.SOUTH);}returnjContentPane;}/** * This method initializes jTextField * * @return javax.swing.JTextField */privatejavax.swing.JTextFieldgetJTextField(){if(jTextField==null){jTextField=newjavax.swing.JTextField();}returnjTextField;}/** * This method initializes this * * @return void */privatevoidinitialize(){this.pack();this.setSize(400,300);this.setContentPane(getJContentPane());this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}