Java: Taste abfragen ohne Event?

OP (Firma: Q3) #6063379
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?
OP (Firma: Q3) #6064375
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 ...
#6065618
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
Gast #6065766
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.
Gast #6065770
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.
OP (Firma: Q3) #6065993
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.
OP (Firma: Q3) #6065997
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.
OP (Firma: Q3) #6065999
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.
Gast #6066217
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.
OP (Firma: Q3) #6066515
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren