Следующая программа включает код, который завершит программу, в которой отсутствуют посторонние потоки, без явного вызова System.exit (). Чтобы применить этот пример к приложениям, использующим потоки / слушатели / таймеры и т. Д., Нужно только вставить код очистки, запрашивающий (и, если применимо, ожидающий) их завершения, прежде чем WindowEvent будет вручную инициирован в actionPerformed ().
Для тех, кто хочет скопировать / вставить код, способный работать точно так, как показано, в конце включен немного уродливый, но в остальном неуместный основной метод.
public class CloseExample extends JFrame implements ActionListener {
private JButton turnOffButton;
private void addStuff() {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
turnOffButton = new JButton("Exit");
turnOffButton.addActionListener(this);
this.add(turnOffButton);
}
public void actionPerformed(ActionEvent quitEvent) {
/* Iterate through and close all timers, threads, etc here */
this.processWindowEvent(
new WindowEvent(
this, WindowEvent.WINDOW_CLOSING));
}
public CloseExample() {
super("Close Me!");
addStuff();
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
CloseExample cTW = new CloseExample();
cTW.setSize(200, 100);
cTW.setLocation(300,300);
cTW.setVisible(true);
}
});
}
}