Si le entiendo correctamente, desea cerrar la aplicación incluso si el usuario no hizo clic en el botón cerrar. Deberá registrar WindowEvents tal vez con addWindowListener () o enableEvents (), lo que mejor se adapte a sus necesidades.
Luego, puede invocar el evento con una llamada a processWindowEvent (). Aquí hay un código de muestra que creará un JFrame, esperará 5 segundos y cerrará el JFrame sin interacción del usuario.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ClosingFrame extends JFrame implements WindowListener{
public ClosingFrame(){
super("A Frame");
setSize(400, 400);
//in case the user closes the window
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
//enables Window Events on this Component
this.addWindowListener(this);
//start a timer
Thread t = new Timer();
t.start();
}
public void windowOpened(WindowEvent e){}
public void windowClosing(WindowEvent e){}
//the event that we are interested in
public void windowClosed(WindowEvent e){
System.exit(0);
}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
//a simple timer
class Timer extends Thread{
int time = 10;
public void run(){
while(time-- > 0){
System.out.println("Still Waiting:" + time);
try{
sleep(500);
}catch(InterruptedException e){}
}
System.out.println("About to close");
//close the frame
ClosingFrame.this.processWindowEvent(
new WindowEvent(
ClosingFrame.this, WindowEvent.WINDOW_CLOSED));
}
}
//instantiate the Frame
public static void main(String args[]){
new ClosingFrame();
}
}
Como puede ver, el método processWindowEvent () hace que se active el evento WindowClosed donde tiene la oportunidad de hacer algo de código de limpieza si lo necesita antes de cerrar la aplicación.