O programa a seguir inclui código que encerrará um programa sem threads estranhos sem chamar explicitamente System.exit (). Para aplicar este exemplo a aplicativos que usam threads / ouvintes / temporizadores / etc, basta inserir o código de limpeza solicitando (e, se aplicável, aguardando) seu encerramento antes de WindowEvent ser iniciado manualmente em actionPerformed ().
Para aqueles que desejam copiar / colar código capaz de funcionar exatamente como mostrado, um método principal um pouco feio, mas irrelevante, está incluído no final.
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);
}
});
}
}