Запуск метода при закрытии программы?

Мне нужно выполнить метод (метод, который создает файл), когда я выхожу из своей программы, как бы это сделать?

Ответ 1

Добавить крюк остановки. Смотрите 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"));
}

Ответ 2

Поскольку вы используете 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, в нем указано, что

Когда виртуальная машина завершена из-за выхода пользователя из системы или выключения системы базовая операционная система может разрешать только фиксированное количество времени в который должен закрыться и выйти. это поэтому нецелесообразно пытаться взаимодействия с пользователем или для выполнения долговременное вычисление при завершении работы крюк

Ответ 3

Внедрить WindowListener (или расширить WindowAdapter), используйте windowClosing (если ошибки в процессе должны помешать закрытию окна или что-то еще например) или windowClosed.

Вот ссылка на официальный учебник Sun (Erm... Oracle), в котором рассказывается, как создать WindowListener и добавить его в JFrame: http://download.oracle.com/javase/tutorial/uiswing/events/windowlistener.html

Ответ 4

Вы также можете добавить окно приложения close close-для вашего приложения.

Ответ 5

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);

Не тестировали, но это должно вас заставить. Кроме того, вам не нужно использовать конструктор по умолчанию, если вы хотите передать некоторые параметры этому потоку.

Ответ 6

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();
                            }

    }
});