problem ist das verzögern, lass ich meinen finger auf die taste für links, ruckt er einmal, dann kurze pause, dann flüssig weiter, wechsel ich nach rechts, wieder verzögerung erst danach flüssig....
für eine gute steuerung müsste es beidseitig aber sofort und unterbrechungsfrei laufen.
Das ist jetzt nicht wirklich ein Gebiet indem mich perfekt auskenne, aber ich wenn mich recht entsinne sieht es doch so aus:
Das Painting findet in dem AWT-Event-Thread statt, genauso auch die Ausführung der Listener.
Wenn nun eine Taste gedrückt wird, dann wird in die AWT-Event-Queue der KeyPress hinterlegt und sobald die Queue die Stelle mit dem KeyPress erreicht, wird dein Listener ausgeführt, und du befiehlst dann Swing wiederum ein Repaint in die AWT-Event-Queue zu legen.
Also auf kurz oder lang ist es so langsam weil mit jedem Tastendruck andauernd neu gezeichnet werden muss, wenn das Repainten 50msec braucht, dann ist es unter optimalen Einflüssen schon alleine nur rein 20 mal pro Sekunde möglich zu repainten, da noch deutlich mehr in der AWT-Event-Queue getan wird, liegt der Wert natürlich deutlich unter den 20.
Dass du andauernd repaintest ist das Problem
"...it's not a bug, it's a feature!"
Wenn Du im Java-Editor einfach mal eine Taste gedrückt hältst, dürfte das Verhalten auch so sein: zunächst wird nur einmal reagiert und nach einer gewissen Wartezeit wird dann flott hintereinander wiederholt reagiert, solange die Taste gedrückt bleibt. Bei mir auf dem Mac heißt das in den Systemeinstellungen "Ansprechverzögerung" und läßt sich einstellen. Wie es unter Windows ist, kann ich gerade nicht sagen.
Als Lösungsvorschlag würde ich bei einem Keypressed-Event einen Thread starten, der die gewünschte Aktion wiederholt vollführt und bei einem Keyreleased-Event müßte dieser Thread dann wieder beendet werden. Dabei darf dieser Thread natürlich nicht erneut gestartet werden, wenn er ohnehin schon läuft.
"...it's not a bug, it's a feature!"
Bei mir auf dem Mac heißt das in den Systemeinstellungen "Ansprechverzögerung" und läßt sich einstellen. Wie es unter Windows ist, kann ich gerade nicht sagen.
AFAIR stand da eher drin, dass man bei keyPressed ein flag=true setzen sollte, und bei keyReleased ein flag=false. Im Hauptthread wird dann nur dieses Flag abgefragt. Aber bitte nicht bei jedem Tastendruck einen eigenen Thread starten :autsch: