1. 程式人生 > >關於Java Swing的窗體關閉事件的呼叫關係

關於Java Swing的窗體關閉事件的呼叫關係

   Java Swing的窗體和對話方塊的關閉事件無非就是windowClosing和windowClosed這兩個方法,如果要在關閉時進行“是否退出”之類的提示或儲存資料等操作時則需要用到這些方法,但到底是該用哪個方法則有一定的講究。

  windowClosing用於窗體關閉時被呼叫,這個時候窗體還處在執行並顯示當中,所以為了方便可以把這個方法稱為關閉前呼叫的方法。值得注意的是當我們按下窗體或對話方塊的的右上角的關閉按鈕時此方法會被呼叫。

  windowClosed用於窗體被關閉後被呼叫,一般當我們用程式碼方式來關閉窗體或對話方塊時則會呼叫此方法。

  與窗體或對話方塊關閉相關的方法是dispose,這個方法在被呼叫後會釋放相關的窗體消失並釋放相應的資源,然後再呼叫windowClosed方法。當然也可以用System.exit(0)方法直接退出程式來達到關閉窗體的效果,但這樣一來的話程式則不會呼叫windowClosed事件。

  另外根據這兩個事件的名稱往往會給人以一個誤解,認為窗體關閉時會先呼叫windowClosing,然後再呼叫windowClosed,實則不然,如果用dispose來關閉窗體的話是不會呼叫windowClosing方法的。

OK!我寫了一段程式用以說明這兩個方法呼叫關係

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class CloseEventDemo extends JFrame
{
	public static void main(String[] args)
	{
		new CloseEventDemo();
	}

	public CloseEventDemo()
	{
		// 建立一個面板
		JPanel paContent = new JPanel(new FlowLayout(FlowLayout.CENTER));
		paContent.setPreferredSize(new Dimension(400, 100));
		// 在面板中建立一個按鈕用於關閉窗體
		JButton btn = new JButton("關閉");
		btn.setPreferredSize(new Dimension(100, 25));
		btn.addActionListener(new ActionListener()
		{

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

		});
		// 向面板中載入按鈕
		paContent.add(btn);

		// 設定面板
		this.setTitle("Close Event Demo");
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		this.setContentPane(paContent);
		this.pack();
		this.setLocationRelativeTo(null);
		this.setVisible(true);
		this.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println("觸發windowClosing事件");
				closeFrame();
			}

			public void windowClosed(WindowEvent e)
			{
				System.out.println("觸發windowClosed事件");
			}
		});
	}

	// 關閉窗體
	private void closeFrame()
	{
		System.out.println("呼叫窗體關閉功能");
		int result = JOptionPane.showConfirmDialog(null, "是否要退出?", "退出確認", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
		if (result == JOptionPane.YES_OPTION)
			this.dispose();
	}
}