Como interseptar o botao fechar janela?

Pessoal, estou querendo interseptar o botao x do meu jPanel para que seja realizadas algumas funcoes antes de fecha-lo.

Alguem poderia me ajudar…

Obrigado

Gustavo.

Tenta isso :

JFrame.addWindowListener(new WindowAdapter() 
		{
            public void windowClosing(WindowEvent evt)
			{
				Comandos
				System.exit(0); //Fecha Tela
            }
});

[]´s

Muito obrigado… nao me lembrava deste método.

Estou com uma outra duvida… gostaria de colocar um addkeyListener no frame fazendo com que quando o usuario aperte Esc o Frame feche… e tb estou querendo deixar um botao com Default, fazendo com que quando aperte a tecla Enter acione o botao Default… jah tentei com o setDefaultCapable mas nao deu certo…

Obrigado.

Gustavo

Enter no botao:

SeuBotao.addKeyListener(new KeyAdapter() 
		{
	                public void keyPressed(KeyEvent evt) 
		{
		int intKey = evt.getKeyCode();
		if (intKey == KeyEvent.VK_ENTER)				Comandos ...
		}
});

Fechar Frame com o ESC:

JFrame.addKeyListener(new KeyAdapter() 
		{
	                public void keyPressed(KeyEvent evt) 
		{
		int intKey = evt.getKeyCode();
		if (intKey == KeyEvent.VK_ESC)				   System.exit(0);
		}
});

Nao sei se o esquema do ESC está certo. Testa ae, fiz de cabeça.

[]´s

Entao Thiago, eu já tinha feito istoque vc disse… adicionando um keyListener no meu panel mas tinha obtive êxito… não sei porque ele nao escuta o teclado… ???

O que vc acha que pode estar acontecendo…

Obrigado

Gustavo.

Voce tem que colocar no JFrame e não no JPanel.

Muda ae. Fim de expediente!

Até segunda.

[]´s

amigo galvim…vc não deve colocar o ouvinte no JPanel, a nao ser que queira fazer algo muito específico…pelo que nosso amigo Rani te passou, acredito que nao tenha mais nenhum codigo que eu possa te passar…implemente o ouvinte no JFrame, pois, quando o usuário for fechar o JFrame algo irá acontecer…por exemplo, vc pode colocar uma mensagem para saber se o usuário realmente deseja sair…vc pode testar ver se há ainda algum JInternalFrame, no caso de estar fazendo uma aplicação com menus, para testar se há algum aberto ainda…mas faça conforme o amigo Thiago passou, vai dar certo…!!

Ate mais…

Ola,

Eu acho que colocar o listener no JFrame tb não vai funcionar.

Vc terá que usar :

java.awt.Toolkit.addAWTEventListener(AWTEventListener listener, long eventMask)

[]'s

E ae lopes, beleza?

No JInternalFrame funciona, será que no JFrame não?
Voce já fez o teste?

[]´s

Bom,

Não funciona, ou pelo menos não sempre.

A melhor solução talvez seja:

	protected void processKeyEvent(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
			System.exit(0);
		}
		super.processKeyEvent(e);
	}

No JFrame.

[]'s

Fala ae pessoal… estou tentando fazer o que vcs disseram…
Eu estou usando JDialog… e todas os meus paineis estao praticamente desta seguinte maneira…

Dêem uma olhada no codigo… eu tentei mudar para Jframe mas dá uns pau… o que eu estou fazendo de errado…

[code] class SelectNameWindow extends JDialog implements ActionListener
{
JLabel lbName;
JTextField txtName;
// JFrame panel;
JPanel panel;
JButton btOk, btCancel;
static String viewName;
String user;

SelectNameWindow(String user)
{

	super(new Frame(), "Painel de Controle", true);

	this.user = user;
	viewName = "";

	lbName = new JLabel("Nome da Seleção: ");
	lbName.setBounds(30,20,200,20);

	txtName = new JTextField(new ControlText(50),"",50);
	txtName.setBounds(30,50,200,20);


	btOk= new JButton("Ok");
	btOk.setBounds(270,30,90,30);
	btCancel = new JButton("Cancelar");
	btCancel.setBounds(270,70,90,30);

	btOk.addActionListener(this);
	btCancel.addActionListener(this);

	panel = new JFrame();
	panel = new JPanel();
	panel.setLayout(null);
	panel.add(lbName);
	panel.add(txtName);
	panel.add(btCancel);
	panel.add(btOk);

/* panel.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent evt)
{
int intKey = evt.getKeyCode();
if (intKey == KeyEvent.VK_ESCAPE)
{
System.exit(0);
}

	  } 
  }); 

*/

	setContentPane(panel);

	addWindowListener(new WindowAdapter(){
	public void windowClosing(WindowEvent e)
     {
		viewName = "";			
		dispose();
     }
    });



/*	
  btOk.addKeyListener(new KeyAdapter() 
  { 
      public void keyPressed(KeyEvent evt) 
	  { 
		int intKey = evt.getKeyCode(); 
		if (intKey == KeyEvent.VK_ENTER)            
			System.out.println("teste");
	  } 
  });  

*/

	setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
	//addWindowListener(new WindowKeeper());


	setSize(450,170);
	show();
}

[/code]

Ola,

Eu tentei con VK_ESCAPE e não está dando certo tb. O máximno que consegui até agora foi usando outra tecla. Exemplo:

package com.mlopes.examples.guj;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class SelectNameWindow
	extends JInternalFrame
	implements ActionListener
{
	static String viewName;
	JButton btCancel;
	JButton btOk;
	JLabel lbName;
	JPanel panel;
	JTextField txtName;
	String user;
	Action closeWindow;

	SelectNameWindow(String user)
	{
		super("Painel de Controle", true, true, true, true);

		this.user = user;
		viewName = "";
		
		closeWindow = new AbstractAction("Cancel") {

			public void actionPerformed(ActionEvent e) {
				doDefaultCloseAction();				
			}
			
		};		

		lbName = new JLabel("Nome da Seleção: ");
		txtName = new JTextField();
		txtName.setColumns(40);
		btOk = new JButton("Ok");
		btCancel = new JButton(closeWindow);

		btOk.addActionListener(this);
		
		
		panel = new JPanel(new BorderLayout());
		JPanel buttonPanel = new JPanel(new GridLayout(1,2));
		buttonPanel.add(btCancel);
		buttonPanel.add(btOk);
		
		JPanel northPanel = new JPanel(new FlowLayout());
		northPanel.add(lbName);
		northPanel.add(txtName);
		
		JPanel southPanel = new JPanel(new BorderLayout());
		southPanel.add(buttonPanel, BorderLayout.EAST);
		
		panel.add(northPanel, BorderLayout.NORTH);
		panel.add(southPanel, BorderLayout.SOUTH);

		setContentPane(panel);
		
		setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
		
		this.addKeyListener(new KeyListener() {

			public void keyTyped(KeyEvent e) {
				System.out.println(e);
				
			}

			public void keyPressed(KeyEvent e) {
				System.out.println(e);
				
			}

			public void keyReleased(KeyEvent e) {
				System.out.println(e);
				
			}
		});
		
		getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), "closeWindow");
		getActionMap().put("closeWindow", closeWindow);
		
		pack();
	}
	

	public void actionPerformed(ActionEvent e) {
		// sei la
	}

}

Se conseguir de outro jeito eu aviso.

[]'s

mLopes,

muito obrigado, mas eu tenho que usar JDialog por causa da minha aplicação, não tem como utilizar JInternalFrame pq terei que mudar muita coisa, a forma de adicionar ele eh diferente e vai dar uns paus, segundo o meu amigo aqui. Ele tb já tentou utilizar o jInternalFrame na nossa aplicação e ele chegou na conclusao que temos que utilizar JDialog mesmo.

Acho que nao vai valer a pena mudar todo o codigo, nossa aplicação esta praticamente pronta… soh esta faltanto alguns detalhes como dar um dispose na tela com esc e deixar os botoes de Ok como Default. …
… não sei pq que nao da certo com JDialog. ???

se vc conseguir algo me da um alo

[]'s

Gustavo

Caro colega tb tava com essa dúvida. Estou começando agora em java e uso o NetBeans. Não estou criando meus formulários dinamicamente, uso a interface gráfica mesmo. Eu o seguinte.

Crie um metodo para fechar o formulario principal

private void fechar() {
if(javax.swing.JOptionPane.showConfirmDialog(null,“Deseja sair do sistema”,"ATENÇÂO ",javax.swing.JOptionPane.YES_NO_OPTION )==0){
dispose();
}
}

Esse metodo eu chamo no botão fechar que coloquei no formulario principal. No envento ActionPerformed do botão.

E no formulario na propriedade "defaultCloseOperation" eu mudei para DO_NOTHING, ate agora funcionou. Quando clico no botao X do form, não acontece nada. Quando clico no botão fechar que coloquei no formulário me vem a mensagem e escolho entre fechar ou não (yes / no).
Acho que era isso que queria…