Das mit dem repaint hast du drin?
Jedes Mal, wenn das Schwert ein Stück weiterrückt, muss es ja neu gezeichnet werden.
Bei dir sind alle Zeichendurchgänge bis zur Zielposition in einer Schleife durch in einer einzigen Funktion, die im Actionlistener aufgerufen wird.
Das Problem hier ist:
Im Hintergrund läuft von Java aus ja ein Framework mit (Ist im Gegensatz zu zB C eigentlich das Grundprinzip von Java), dass zB wenn du einen Button erstellst dafür da ist, dass der Button gezeichnet wird, ohne dass du in deinem jeden einzelnen Strich selber extra zeichnen musst; und die Ausgabe zum Bildschirm etc übernimmt.
Wenn jetzt ein Button gedrückt wird, läuft das zuerst auch zum Framework, das dann von sich aus weiter deinen Actionlistener aufruft.
Und eben das ist das Problem.
Das Framework ruft deinen Actionlistener als eine normale Methode auf und macht erst dann mit seiner eigenen Arbeit weiter, wenn dein Actionlistener fertig ist.
Du zeichnest im Actionlistener das erste Mal ein Schwert-gut, ab in die Warteschlange damit.
Zweites mal ein wenig verschoben zeichnen-ab in die Warteschlange.
Wenn das Framework gleichzeitig zu deiner Funktion weiterarbeiten würde, würde es das ganze auch auf den Bildschirm zeichnen.
So wird aber erst weitergemacht, wenn dein Schwert bis zur letzten Position weitergerückt und und zum Zeichnen gegeben worden ist, und dein Actionlistener somit fertig ist.
Das ganze kannst du mit einem Thread lösen.
Ist quasi eine Methode, um mehrere verschiedene Sachen gleichzeitig nebeneinander laufen zu lassen.
Dafür:
1) Rufst du in der Klasse Schwert die Methode move nicht gleich im Konstruktor auf.
2) implementierst für Schwert das Interface Runnable
3) schreibst in Schwert noch eine Methode run, die in sich move aufruft
4) und verwendest den Actionlistener nur noch, um das Schwert zu "starten"