Zu windowClosed fällt mir nichts sinnvolles ein, aber zu windowClosing.
Du möchtest, dass bestimmte Daten, wie die Fenstergröße oder die Fensterposition oder Daten aus irgendeiner Tabelle in einer Datei/Datenbank, whatever abgespeichert wird, willst es aber nicht während der Laufzeit des Programms machen, da es je nach Datenmenge viel Systemleistung ziehen kann. Daher behälst du die Daten erstmal im Arbeitsspeicher und lässt den User arbeiten. Wenn das Fenster geschlossen wird, also noch NICHT(!) zu ist, sollen die Daten gespeichert werden, damit man sie später, bei einem neuen Programmstart wieder laden kann.
Nun verwendest du die Methode windowClosing, weil diese Methode nur aufgerufen wird, wenn das Fenster geschlossen werden SOLL(!), es aber noch im Arbeitsspeicher und auf dem Bildschirm des Users noch zu sehen ist!
windowClosed ist in diesem Fall schon zu spät, weil alle Daten freigegeben wurden und das Fenster nirgends mehr aufzufinden ist. Weder im Arbeitsspeicher noch auf dem Bildschirm des Users.