Страница 3 из 3
Использование shutdown-ловушки В Листинге 3 приведен вариант этого же приложения, который разрешает эту проблему. Новый вариант приложения модифицирует код из Листинга 2, устанавливая shutdown-ловушку. Класс этой ловушки определяется как внутренний класс основного класса приложения. Таким образом, он получает доступ ко всем полям и методам основного класса. В Листинге 3 метод run класса-ловушки просто вызывает метод shutdown основного класса. Этим гарантируется его вызов по завершению приложения. Листинг 3 package test;
import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.io.File; import java.io.IOException;
public class MySwingAppWith ShutdownHook extends JFrame { JButton exitButton = new JButton(); JTextArea jTextArea1 = new JTextArea();
String dir = System.getPro perty("user.dir"); String filename = "temp. txt";
public MySwingAppWithShut-downHook() { exitButton.setText("Exit"); exitButton.setBounds(new Rectangle(304, 248, 76, 37)); exitButton.addActionListener(new java.awt.event.Ac-tionListener() { public void actionPer-formed(ActionEvent e) { exitButton_actionPerformed(e); } });
this.getContentPane().set Layout(null); jTextArea1.setText("Click the Exit button to quit"); jTextArea1.setBounds(new Rectangle(9, 7, 371, 235)); this.getContentPane().add (exitButton, null); this.getContentPane().add (jTextArea1, null); this.setDefaultCloseOpera-tion(EXIT_ON_CLOSE); this.setBounds(0,0, 400, 330); this.setVisible(true); initialize(); }
private void initialize() { //добавление shutdown-ловушки MyShutdownHook shutdown Hook = new MyShutdownHook(); Runtime.getRuntime().addShutdownHook(shutdownHook);
//создание временного файла File file = new File(dir, filename);
try { System.out.println("Crea-ting temporary file"); file.createNewFile(); } catch (IOException e) { System.out.println("Failed creating temporary file."); } }
private void shutdown() { //удаление временного файла File file = new File(dir, filename); if (file.exists()) { System.out.println("Dele-ting temporary file."); file.delete(); } }
void exitButton_action Performed(ActionEvent e) { shutdown(); System.exit(0); }
public static void main (String[] args) { MySwingAppWithShutdown Hook mySwingApp = new My SwingAppWithShutdownHook(); }
private class MyShutdown Hook extends Thread { public void run() { shutdown(); } } } Обратите внимание на метод initialize. Первое, что он делает - создает экземпляр внутреннего класса MyShut-downHook, который наследует класс Thread. MyShutdownHook shutdown Hook = new MyShutdownHook(); Теперь, получив экземпляр класса MyShutdownHook, мы регистрируем его в Runtime с помощью метода addShut downHook: Runtime.getRuntime().add ShutdownHook(shutdownHook); Оставшаяся часть метода initialize в точности соответствует такому же методу из Листинга 2. В этой части создается временный файл и выводится строчка Creating temporary file. Теперь попробуйте запустить это небольшое Swing-приложение. Убедитесь в том, что временный файл удаляется в любом случае, каким бы способом вы ни закрыли приложение. Shutdown-ловушки, которые мы рассмотрели в этой статье, являются фактически единственным правильным решением проблемы выполнения какого-либо кода по завершению приложения. А поскольку нельзя быть уверенным в том, каким образом пользователь на этот раз закроет ваше приложение, их использование значительно облегчит вам жизнь, гарантируя выполнение установленных вами правил. Budi Kurniawan |