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…
cv1
Carioca, ele ja fez isso
Dennys, cara, nao sei eu achava que colocando no container pai-de-todos dava certo
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.
Dennys
hum…
Alguém já passou por isso?!?!?
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.
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!!!
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:
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…
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:
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…
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);}}