Evento que funcione em qualquer componente de um jframe

Olá Pessoal! Tenho um jframe com 10 textfields, quero que ao teclar esc encerre o frame independentemente de em qual textfield estiver com o focu.
Alguém pode ajudar? Obrigado!

  Cara da uma olha no tutorial da sum sobre swing ele é muito bom da pra fazer download dele,

tem uma parte com muitos exemplos de códigos que funcionam muito bem. tenta colocar um botão de saida e um mnemonic nele(não sei qual é o do esc) tenta la. Quando o usário der esc para sair do sistema da sistem(0).
Pesquisa ai…

Talvez assim

public class CaptureAllEvents extends JPanel {

	public CaptureAllEvents() {
		Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
			public void eventDispatched(AWTEvent event) {
				KeyEvent keyEvent = (KeyEvent) event;
				if (keyEvent.getID() == KeyEvent.KEY_RELEASED
						&& keyEvent.getKeyCode() == KeyEvent.VK_ESCAPE) {
					System.out.println("ESC");
				}
			}
		}, AWTEvent.KEY_EVENT_MASK);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setContentPane(new CaptureAllEvents());
		frame.setSize(800, 600);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}

Olá colega fabiofalci, mais uma vez obrigado por sua ajuda! Implementei sua sugestão e funciona blz, em qualquer componente do frame que eu pressonar esc encerra o frame. O problema é que esse frame comtém atalhos para cadastros, aos quais abrem jdialogs modais para esses cadastros. Só que se eu abrir um novo jdialog desses, e pressionar esc nele, o frame é encerrado, ou seja, como o evento é da janela ele continua a ser executado mesmo com o jdialog aberto. Eu tentei driblar isso de várias formas, através de vários métodos pra saber se tem um jdialog executando, mas nao consegui… Vc tem alguma ajuda?

Pensa que esse eh um evento do teu sistema inteiro. Sempre que tu teclar ESC será chamado esse método,
independente do frame, dialog, panel que vc estiver. Tem que criar um controle que diga onde vc está.

Se vc está no teu frame, vc fecha a aplicação. Se vc está num dialog, vc fecha o dialog, etc.

Axo que seria mais fácil colocar os eventos só no frame, ou só no jdialog, ou so no jpanel, do que implementar esse controle pra saber onde está. E tem mais problemas, pq as mesmas teclas de atalho usadas no frame ou usarei no jdialog, tipo se teclar f1 no frame abre um novo jdialog, mas se teclar f1 em determinado textfield do jdialog abre uma jtable. Entao, se colocar o evento na primeira janela, ou seja no frame, terá que dar um jeito de nao ser executado quando se estiver em um jdialog, ou nao usar a mesma tecla… Será que nao tem como colocar eventos no frame,no jdialog ou no jpanel? mas nao na janela… para que sejam executados em qualquer componente deles que esteja? Obrigado!

Cara, por um acaso você já tentou declarar ouvinte por ouvinte do seu evento?
Sei que é mais trabalhoso e deve ter um jeito mais fácil, mas faz um teste.

Abraços,

Olá Pimenta! Quando vc disse “ouvinte por ouvinte” acredito que seja colocar o evento em cada componente… Funciona, mas não é eficiente. Imagine um frame com 20 textfields e 5 botoes, vai se colocar 25 eventos?? Obrigado pela ajuda.

É, concordo que não seria nada eficiente, mas pra botar funcionando e depois aperfeiçoar seria uma saída…

Já tentou utilizar a API de Reflection para identificar de qual classe é o componente que lançou o evento e decidir se fecha ou não fecha?

De repente funciona…

Não, ainda nao tentei. Dessa forma seria mais ou menos a mesma sugestao do nosso colega fabiofalci: " Pensa que esse eh um evento do teu sistema inteiro. Sempre que tu teclar ESC será chamado esse método, independente do frame, dialog, panel que vc estiver. Tem que criar um controle que diga onde vc está. Se vc está no teu frame, vc fecha a aplicação. Se vc está num dialog, vc fecha o dialog, etc. "
Imagino que colocar o evento só em determinado componente, no jpanel ou jdialog por exemplo, seja mais facil e mais eficiente do que implementar esse controle, ou não? vlw

Cara, depende, mas pensa na reutilização.
Caso precisasse desse “controle” em algum outro lugar do seu sistema poderia reutilizá-lo sem digitar mais nenhuma linha de código.