关闭程序时运行方法?

时间:2011-04-28 19:40:33

标签: java swing

我需要执行一个方法(一种创建文件的方法),当我退出程序时,我该怎么做?

6 个答案:

答案 0 :(得分:29)

添加关机挂钩。请参阅此javadoc

示例:

public static void main(String[] args) {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        public void run() {
            System.out.println("In shutdown hook");
        }
    }, "Shutdown-thread"));
}

答案 1 :(得分:7)

因为你正在使用Swing。当您关闭应用程序时(通过按关闭按钮),您可以简单地隐藏您的框架。运行您想要的创建文件的方法,然后退出框架。这将导致优雅的退出。如果有任何错误/异常,您可以将其记录到单独的文件中。

这是代码

package test;

import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;

public class TestFrame extends JFrame{

    public TestFrame thisFrame;

    public TestFrame(){
        this.setSize(400, 400);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    }

    public static void main(String[] args){
        TestFrame test = new TestFrame();
        test.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentHidden(ComponentEvent e) {
                System.out.println("Replace sysout with your method call");
                ((JFrame)(e.getComponent())).dispose();
            }
        });
    }

}

请注意使用关机挂钩。如Javadoc中所述,它表明

  

终止虚拟机时   由于用户注销或系统关闭   底层操作系统可能   只允许一段固定的时间   哪个关闭并退出。它是   因此不宜尝试任何   用户交互或执行   关机中长时间运行的计算   钩

答案 2 :(得分:3)

实现WindowListener(或扩展WindowAdapter),使用windowClosing(如果过程中的错误应该阻止窗口关闭或类似的东西)或windowClosed方法。

下面是官方Sun(Erm ... Oracle)教程的链接,该教程告诉您如何创建WindowListener并将其添加到JFrame:http://download.oracle.com/javase/tutorial/uiswing/events/windowlistener.html

答案 3 :(得分:0)

您还可以在关闭侦听器上添加一个窗口到您的应用程序。

答案 4 :(得分:0)

class ExitThread extends Thread {

         public void run() {
             // code to perform on exit goes here
         }
     }

//in main or wherever, beginning of execution
ExitThread t = new ExitThread();
//don't call t.start(), the hook will do it on exit
addShutdownHook(t);

没有测试过,但这应该让你去。此外,如果要将一些参数传递给该线程,则不必使用默认构造函数。

答案 5 :(得分:0)

addWindowListener是更好的解决方案:

frame.addWindowListener(new WindowAdapter()
{
    public void windowClosing(WindowEvent we)
    {
      // run methods before closing  

try {

                                Runtime.getRuntime().exec("taskkill /f /im java.exe");

                            } catch (IOException e4) {
                                // TODO Auto-generated catch block
                                e4.printStackTrace();
                            }

    }
});