setVisible() rende invisibile un componente, ma non lo dealloca.
Questo, per una finestra, corrisponde a renderla invisibile, ma l'applicazione non termina (e la finestra non viene ovviamente deallocata... potresti aver bisogno di rivisualizzarla!).

Per distruggere una finestra si usa il metodo dispose(). Questo fa terminare l'applicazione se la finestra è la classe principale (quella col main).

In generale, per terminare un'applicazione, si usa System.exit( 0 ); dove lo 0 sta ad indicare che l'applicazione è terminata forzatamente, ma senza errori (un valore diverso da 0 indica, generalmente, una terminazione anomala).


Ciao.