Füge dem JFrame mit addWindowListner einen WindowAdapter hinzu und überschreibe die Methode windowClosing. Wenn du DefaultCloseOperation auf DO_NOTHING_ON_CLOSE setzt, kannst du an dieser Stelle z.B. auch einen Dialog einbauen, ob man wirklich schließen will und erst dann das Beenden deines Programms einläuten, mit allem was dazugehört.
Zwei Hinweise
Falls du DefaultCloseOperation auf EXIT_ON_CLOSE setzt, wird windowClosed nicht aufgerufen, deshalb verwende windowClosing.
System.exit(x) beendet das Programm sofort und auf der Stelle, ohne dass noch irgend ein Event ausgelöst wird.