Forum: PC-Programmierung Java: Taste abfragen ohne Event?


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Aus Xojo (ehemals RealBasic) kenne ich z.B. die Funktionen

Keyboard.AsyncControlKey() as boolean
Keyboard.AsyncAltKey() as boolean
Keyboard.AsyncShiftKey() as boolean

die liefern bei Aufruf den Zustand der Steuerungstasten (Shift, Alt, 
Strg) ohne Event. D.h. ich kann z.B. ein Programm auch mit gehaltener 
Alt-Taste starten und darauf entsprechend reagieren (z.B. default 
preferences verwenden) oder eben irgendwo im Code deren Status abfragen.

Bei Java kenne ich bisher nur die dynamisch reagierenden Listener ... 
gibts etwas Vergleichbares zur statischen Abfrage der Tasten auch in 
Java?

von Eric B. (beric)


Lesenswert?

Der Listener kann doch einfach eine class-Variabele setzen (z.B. bool 
isControlKeyPressed) die du dann nach Lust und Laune abfragen kannst?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Eric B. schrieb:
> Der Listener kann doch einfach eine class-Variabele setzen (z.B.
> bool
> isControlKeyPressed) die du dann nach Lust und Laune abfragen kannst?

Ich haben doch genau beschrieben, warum das m.E. nicht reicht. Also 
nochmal anders:

Ein Java-Listener reagiert nur auf dynamische Vorgänge, wie das Drücken 
(key down) oder Loslassen (key release) einer Taste. Zudem haben die 
Control-Tasten (Shift, Alt, Crtl) keine Tastenwiederholung und lösen 
ohne "Begleittaste" (z.B. Alt+A) m.W. keinen Event aus. Auch bekommt ein 
Listener nichts davon mit, wenn eine Taste vor dem Programmstart 
gedrückt wurde und während des Programmstarts gedrückt bleibt ...

: Bearbeitet durch User
von Holger D. (hodoe)


Lesenswert?

Hallo, ich habe ein Programm, bei dem zu Beginn einiges an Sensorik 
abgefragt wird. Um das zu überspringen, muss die CTRL-Taste gedrückt 
werden.

Meinem Hauptfenster (JFrame) habe ich einen Listener verpasst:
1
hauptFenster.addKeyListener((KeyListener) new hauptFensterCTRLLauscher());

Und hier der Listener:
1
public class hauptFensterCTRLLauscher implements KeyListener 
2
  {
3
    @Override
4
    public void keyPressed(KeyEvent arg0) 
5
    {
6
      if(arg0.isControlDown()) initAbbbrechen = true;
7
    }
8
9
    @Override
10
    public void keyReleased(KeyEvent arg0) 
11
    {
12
    
13
    }
14
15
    @Override
16
    public void keyTyped(KeyEvent arg0) 
17
    {
18
    
19
    }
20
21
  }


Anders habe ich es nicht hinbekommen.



Holger

: Bearbeitet durch User
von Wühlhase (Gast)


Lesenswert?

Frank E. schrieb:
> Auch bekommt ein
> Listener nichts davon mit, wenn eine Taste vor dem Programmstart
> gedrückt wurde und während des Programmstarts gedrückt bleibt ...

Es ist normalerweise IMMER so, daß ein Programm nicht weiß was für 
Tasten gedrückt wurden bevor es gestartet wurde.

Und zum Thema "Taste gedrückt halten" wurde dir ein prima Tipp gegeben 
Event<KeyPressed> -> boolean keyPressed = true, Event<KeyReleased> -> 
boolean keyPressed = false.

von Wühlhase (Gast)


Lesenswert?

Frank E. schrieb:
> Aus Xojo (ehemals RealBasic) kenne ich z.B. die Funktionen
>
> Keyboard.AsyncControlKey() as boolean
> Keyboard.AsyncAltKey() as boolean
> Keyboard.AsyncShiftKey() as boolean
>
> die liefern bei Aufruf den Zustand der Steuerungstasten (Shift, Alt,
> Strg) ohne Event. D.h. ich kann z.B. ein Programm auch mit gehaltener
> Alt-Taste starten und darauf entsprechend reagieren (z.B. default
> preferences verwenden) oder eben irgendwo im Code deren Status abfragen.

Wenn ich dieses Verhalten so haben wollen würde, würde ich mir eine 
Klasse schreiben die es nachahmt.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Holger D. schrieb:
> Hallo, ich habe ein Programm, bei dem zu Beginn einiges an
> Sensorik
> abgefragt wird. Um das zu überspringen, muss die CTRL-Taste gedrückt
> werden.
>
> Meinem Hauptfenster (JFrame) habe ich einen Listener verpasst:
> hauptFenster.addKeyListener((KeyListener) new
> hauptFensterCTRLLauscher());
...
>
> Anders habe ich es nicht hinbekommen.

Interessante Idee. Wenn ich es recht verstehe, gehst  du davon aus, dass 
das startende jar-File den Tastenzustand von der JRE als Prameter 
mitbekommt ...
Werde ich ausprobieren. Danke.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Wühlhase schrieb:
> Frank E. schrieb:
>> Aus Xojo (ehemals RealBasic) kenne ich z.B. die Funktionen
>>
>> Keyboard.AsyncControlKey() as boolean
>> Keyboard.AsyncAltKey() as boolean
>> Keyboard.AsyncShiftKey() as boolean
>>
>> die liefern bei Aufruf den Zustand der Steuerungstasten (Shift, Alt,
>> Strg) ohne Event. D.h. ich kann z.B. ein Programm auch mit gehaltener
>> Alt-Taste starten und darauf entsprechend reagieren (z.B. default
>> preferences verwenden) oder eben irgendwo im Code deren Status abfragen.
>
> Wenn ich dieses Verhalten so haben wollen würde, würde ich mir eine
> Klasse schreiben die es nachahmt.

Sorry, aber diese absolute Null-Info hättest du dir auch sparen können. 
Wenn ich durch die Tür will, mache ich sie vorher auf ... meistens 
jedenfalls.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Wühlhase schrieb:
> Frank E. schrieb:
>> Auch bekommt ein
>> Listener nichts davon mit, wenn eine Taste vor dem Programmstart
>> gedrückt wurde und während des Programmstarts gedrückt bleibt ...
>
> Es ist normalerweise IMMER so, daß ein Programm nicht weiß was für
> Tasten gedrückt wurden bevor es gestartet wurde.
>

Echt jetzt? Ich schrieb aber nicht von "gedrückt wurden", sondern von 
"gedrückt werden" bzw. "gedrückt sind".

> Und zum Thema "Taste gedrückt halten" wurde dir ein prima Tipp gegeben
> Event<KeyPressed> -> boolean keyPressed = true, Event<KeyReleased> ->
> boolean keyPressed = false.

Ja, das habe ich dankend zur Kenntnis genommen, werde es ausprobieren 
und verwenden.

: Bearbeitet durch User
von Wühlhase (Gast)


Lesenswert?

Frank E. schrieb:
> Sorry, aber diese absolute Null-Info hättest du dir auch sparen können.

Ja, sicher. War aber zu verlockend. :)

Ich sags mal so: Dein Ansinnen scheint recht ungewöhnlich. Meistens 
heißt das, daß es einen vorteilhafteren Weg gibt. Außerdem schreibst du 
nichtmal, welchen GUI-Baukasten du verwendest oder rückst sonst eine 
Information raus.

Ich kann mir allerdings auch vorstellen, daß das in Java grundsätzlich 
nicht geht. Ich hab keine Ahnung, was das Betriebssystem der JVM genau 
mitteilt. Wenn das BS auch nur Events mitteilt (was durchaus vernünftig 
wäre), dann hast du rein logisch schon keine Chance, über ein Event, daß 
vor dem Start deines Programms eingetreten ist, benachrichtigt zu 
werden. Dein Programm würde lediglich über das Loslassen der Taste 
benachrichtigt werden. Bzw., da Java den kleinsten gemeinsamen Nenner 
mehrerer Betriebssysteme abbilden muß, wäre es schon ausreichend wenn 
nur eines der unterstützten BS diesen Weg gehen würde.

Wobei das mit dem Loslassen der Taste eine Idee wäre: Wenn du ein 
KeyReleased-Event empfängst ohne daß dem KeyPressed-Event voranging, 
kannst du davon ausgehen, daß die Taste vor dem Start deines Programms 
gedrückt wurde.

Was auch gehen würde: Du schreibst einen Dämon, der auf Tastendrücke 
lauscht und deinem Programm die entsprechenden Informationen mitteilt.

Was davon jetzt aber praktikabel und sinnvoll umzusetzen ist oder dein 
bisheriger Weg einfach Grütze ist und ein ganz anderer Ansatz besser 
wäre...schwer zu sagen ohne mehr Information.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Wühlhase schrieb:
> Frank E. schrieb:
>> Sorry, aber diese absolute Null-Info hättest du dir auch sparen können.
>
> Ja, sicher. War aber zu verlockend. :)
>


Wie ich schon schrieb, Xojo kann das ohne Wenn und Aber für Windows, Mac 
OSX und unter Linux. Frage mich, wie die das machen ... kann also nicht 
völlig unmöglich sein. Aber mein Hauptanliegen, Programmstart mit 
gedrückter Taste geht ja, der Rest ist auch mit Listener zu machen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.