Buenas,
Yo creo que te esta entrando en un bucle porque llamas a this.dispose(), por lo que haces una llamada recursiva al mismo metodo y no sale nunca.
En lugar de this.dispose haz un
super.dispose.
O mejor aun, dado que sobreescribir el metodo dispose es mala practica, sobreescribe por ejemplo el evento windowClosed:
http://docs.oracle.com/javase/tutori...wlistener.html
Un saludo