Das Runnable, das du invokeAndWait übergibst, wird von einem Thread namens Event Dispatcher Thread (EDT) ausgeführt. Das "Wait" sagt, dass du solange im aktuellen Thread warten willst, bis das Runnable ausgeführt wurde.
Wenn du nun bereits im EDT bist, und auf etwas warten willst, das vom EDT ausgeführt werden wird, hast du einen Widerspruch: dein Programm würde auf ewigs blockiert.
Glücklicherweise ist die invokeAndWait-Methode intelligent genug, sowas zu erkennen, und wirft dann den Fehler, den du hier gezeigt hast.