PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfangen von TastaturEingaben



akula
15-04-2006, 21:56
hallo zusammen

Arbeite gerade an einer Modellbahnsteuerung in Java/Swing.
Jetzt moechte ich mit jeweils 3 auf dem Keyboard untereinanderliegende Tasten dazu verwenden um die Geschwindigkeit der Loks zu steuern und das zwar egal welche Komponente des GUI's den Focus hat.

Und zwar soll das so gehen: wenn ich einmal z.B. 'q' druecke erhoeht sich die Geschwindigkeit um 10 KM/h wenn ich 'q' laenger als eine Sekunde druecke geht die Geschwindigkeit mit jeder weiteren Sekunde um 50 KM/h hoch.

Die KeyBindings haben sich als nicht brauchbar herausgestellt, da sie solange die Taste gedrueckt ist wie bloede Events generiert.

Mit dem KeyListener kann ich mich nur auf einem JComponent registrieren ich moechte aber die Events kriegen egal welche Komponente des GUI's den Focus hat. Eine Loesung waere ja schon, dass ich den KeyListener auf jeder Komponente registriere aber es muss doch auch einfacher gehen.

kann mir da jemand behilflich sein ??

danke !

bischi
16-04-2006, 10:50
Keylistener aufs JFrame?

MfG Bischi

akula
16-04-2006, 13:53
Geht nicht.

Auf dem JFrame erhalte ich keine Events, da es wahrscheinlich nicht fokusierbar ist.

Lin728
16-04-2006, 14:23
Müsste eigentlich schon gehen, bin mir aber nicht sicher inwieweit sich das JFrame selbst den Focus hohlt.
Könntest du mal JFrame.requestFocus() versuchen?

akula
16-04-2006, 15:53
Hi

Das mit requestFocus() funktioniert schon, aber sobald man eine Komponente anklickt verliert das JFrame den Focus und es funktioniert nicht mehr.

gruss ben

bischi
16-04-2006, 19:56
Also auf das Frame nen Focus-Listener und falls Fokus verloren geht, Fokus beanspruchen...

MfG Bischi

akula
18-04-2006, 13:18
naja auch nicht unbedingt praktikabel, da ich nun keine JComboBoxes mehr oeffnen kann, da das JFrame sofort wieder den Focus holen geht :-(

akula
24-04-2006, 18:27
Hat keiner noch eine Idee auf Lager ?

Mit den Key-Bindings wuerde es super gehen, wenn die nur nicht immer Events generieren wuerden waehrend ich die Taste gedrueckt halte.

Es kommt immer
keyPressed
keyReleased
keyPressed
...

obwohl ich die Taste nie losgelassen habe

zeeman
26-04-2006, 21:10
frag doch im 1. pressed die zeit ab.
dann fragst du bei jedem released wieder die zeit ab und vergleichst sie
wenn sie groß genug ist -> aktion ausführen (+50km/h) und zeit wieder löschen (auf null setzen, damit das nächste pressed wieder weiß dass es speichern muss)

nicht schön, aber sollte besser gehen als ne requestFocus()-kampf :P

mwanaheri
27-04-2006, 07:48
Zum Focusproblem: Was hindert dich eigentlich daran, eine Listener-Klasse zu schreiben, die du bei allen Elementen registrierst, bei denen du die Tastatureingabe abfangen willst? Bei der Kombobox z.B. wirst du die Tastatureingabe nicht anderweitig verwenden, also darf der Fokus ruhig drauf sein.
Zum dauernden Event auslösen bei gedrückter Taste: Ja, es wird immer wieder ausgelöst. Vom System. Und wenn du die Länge des Tastenhaltens auswerten willst, brauchst du das sogar.