Evento do Teclado no JFrame

Salve Salve Galera!

Ó eu dinovo! :smiley:

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?!

Valeu!!!

Adicione um KeyListener :slight_smile:

Surgiu una dúvida… :cry:

Coloco no JFrame o no JContentPane?

:oops:

Thanks!!!

Voce nao coloca :wink:

JContentPane e JFrame sao “irmaos”… o que vc quer talvez eh o JPanel retornado por JFrame.getContentPane() :wink:

Hum… num sei se fiz caca…

eu iz assim…

		this.addKeyListener(new java.awt.event.KeyListener() { 
			public void keyPressed(java.awt.event.KeyEvent e) {    
				System.out.println("Pressionado!"); 
			}
			public void keyReleased(java.awt.event.KeyEvent e) {} 
			public void keyTyped(java.awt.event.KeyEvent e) {} 
		});

Só que se o foco estiver em um botão por exemplo não funciona… :frowning:

eu preciso que funcione em com o foco em qualquer lugar…

Dica?! Sugestão? Crítica? Devo me suicidar?! :stuck_out_tongue:

Thanks!

Vc pode Implementar o KeyListener em sua Classe seja um JFrame o InternalFrame.

class my_class extends JInternalFrame implements KeyListener{

Mais uma coisa coloca os metodos em alguma parte do seu codigo e manda vê.

	public void keyPressed(KeyEvent e){
		
	}
				
	public void keyReleased (KeyEvent e){


	}

	public void keyTyped (KeyEvent e){

	}

Vc pode implementar junto tbem Focus e Mouse tbem…

Carioca, ele ja fez isso :wink:

Dennys, cara, nao sei :frowning: eu achava que colocando no container pai-de-todos dava certo :frowning:

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:

  1. Crie um JMenuBar. Ele deve ser visible = true, porém o tamanho você coloca 0,0.
  2. Dentro do JMenuBar crie um JMenu, este deve ser visible = false.
  3. Dentro do JMenu crie um JMenuItem, no código você deve acrescentar um accelerator a este JMenuItem assim:
miAjuda.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0) );
  1. Você também deve programar o ActionPerformed deste JMenuItem, no método action Performed você coloca o código que deve executar com F1.
    PRONTO.

Aqui vai uma JFrame com um text e uns botôes onde eu testei isso:

import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;

public class EclipseFrame extends JFrame {
	private javax.swing.JPanel jContentPane = null;

	private javax.swing.JPanel jPanel = null;
	private javax.swing.JTextField txtTeste = null;
	private javax.swing.JPanel jPanel1 = null;
	private javax.swing.JButton btnIncluir = null;
	private javax.swing.JButton btnAlterar = null;
	
	private javax.swing.JMenuBar jJMenuBar = null;
	private javax.swing.JMenu menuSistema = null;
	private javax.swing.JMenuItem miAjuda = null;
	
	public static void main(String[] args) {
		EclipseFrame app = new EclipseFrame();
		app.show();
	}

	public EclipseFrame() {
		super();
		initialize();
	}

	private void initialize() {
		this.setSize(432, 404);
		this.setContentPane(getJContentPane());
		this.setJMenuBar(getJJMenuBar());
		this.addWindowListener(new java.awt.event.WindowAdapter() { 
			public void windowClosing(java.awt.event.WindowEvent e) {    
				System.out.println("Fechando Janela");
				System.exit(0); 
			}
		});
	}

	private javax.swing.JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new javax.swing.JPanel();
			jContentPane.setLayout(new java.awt.BorderLayout());
			jContentPane.add(getJPanel(), java.awt.BorderLayout.NORTH);
			jContentPane.add(getJPanel1(), java.awt.BorderLayout.SOUTH);
		}
		return jContentPane;
	}

	private javax.swing.JPanel getJPanel() {
		if(jPanel == null) {
			jPanel = new javax.swing.JPanel();
			jPanel.add(getTxtTeste(), null);
		}
		return jPanel;
	}

	private javax.swing.JTextField getTxtTeste() {
		if(txtTeste == null) {
			txtTeste = new javax.swing.JTextField();
			txtTeste.setPreferredSize(new java.awt.Dimension(150,20));
		}
		return txtTeste;
	}

	private javax.swing.JPanel getJPanel1() {
		if(jPanel1 == null) {
			jPanel1 = new javax.swing.JPanel();
			jPanel1.add(getBtnIncluir(), null);
			jPanel1.add(getBtnAlterar(), null);
		}
		return jPanel1;
	}

	private javax.swing.JButton getBtnIncluir() {
		if(btnIncluir == null) {
			btnIncluir = new javax.swing.JButton();
			btnIncluir.setText("Incluir");
		}
		return btnIncluir;
	}

	private javax.swing.JButton getBtnAlterar() {
		if(btnAlterar == null) {
			btnAlterar = new javax.swing.JButton();
			btnAlterar.setText("Alterar");
		}
		return btnAlterar;
	}

	private javax.swing.JMenuBar getJJMenuBar() {
		if(jJMenuBar == null) {
			jJMenuBar = new javax.swing.JMenuBar();
			jJMenuBar.add(getMenuSistema());
			jJMenuBar.setVisible(true);
			jJMenuBar.setPreferredSize(new java.awt.Dimension(0,0));
		}
		return jJMenuBar;
	}

	private javax.swing.JMenu getMenuSistema() {
		if(menuSistema == null) {
			menuSistema = new javax.swing.JMenu();
			menuSistema.add(getMiAjuda());
			menuSistema.setText("Sistema");
			menuSistema.setMnemonic(java.awt.event.KeyEvent.VK_S);
			menuSistema.setVisible(true);
		}
		return menuSistema;
	}

	private javax.swing.JMenuItem getMiAjuda() {
		if(miAjuda == null) {
			miAjuda = new javax.swing.JMenuItem();
			miAjuda.setText("Ajuda");
			miAjuda.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0) );
			miAjuda.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					System.out.println("Menu Pressionou F1");
				}
			});
		}
		return miAjuda;
	}
}  //  @jve:visual-info  decl-index=0 visual-constraint="10,10"

Desta forma mesmo estando em outros controles o

Olá,

Esse bacalhau eu ja usei no Forms tb :smiley:

[]'s

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.

hum…

Alguém já passou por isso?!?!? :frowning:

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. :wink:

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*** :wink:

:arrow: Ah! E se alguém souber dá um grito!!! please!!!

Fuizi!Valeu!!!

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

http://www.guj.com.br/forum/viewtopic.php?t=1953&highlight=keylistener

eu não cheguei a testar, talves servem para vocês :wink:

dsiviotti,

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*** :slight_smile:

Valeus!

Tem uma maneira que sempre uso:

  • chamar setFocusable(true); :lol:

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…

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…

import java.awt.event.*;
import javax.swing.*;

public class JFramePrincipal extends JFrame implements ActionListener {
  
  	private javax.swing.JButton jButton = null;
  	
  	public JFramePrincipal() {
		super();
		initialize();
	
		KeyStroke Escape = KeyStroke.getKeyStroke( KeyEvent.VK_ESCAPE ,0 );
    
		JRootPane rootPane = getRootPane();
		rootPane.registerKeyboardAction( this,"Escape",Escape,
		  JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
    
		setSize( 200,200 );
	}
     
	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
        this.setContentPane(getJButton());
			
	}
  public void actionPerformed( ActionEvent evt ) {
	
	String accion = evt.getActionCommand();
	
	System.out.println("A: " + accion);
    
	if ( accion.equals("Escape")) {
		dispose();
		System.exit(0);
	}

  } 

	/**
	 * This method initializes jButton
	 * 
	 * @return javax.swing.JButton
	 */
	private javax.swing.JButton getJButton() {
		if(jButton == null) {
			jButton = new javax.swing.JButton();
		}
		return jButton;
	}
}

O Código tá meio sujo mas dá para ter uma idéia…

E VIVA A VITAMINA DE ABACATE!!! :lol:

Boa! :smiley:
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:

  public void actionPerformed( ActionEvent evt ) { 
    
   String accion = evt.getActionCommand(); 
    
   System.out.println("A: " + accion); 
    
   if ( accion.equals("Escape")) { 
      dispose(); 
      System.exit(0); 
   } 

No tutorial do Java ele cria variáveis tipo

  final String commandEscape = "Escape";

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… :wink: