Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Gedrückte Tasten der Tastatur erfragen?

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.11.2005
    Beiträge
    47

    Gedrückte Tasten der Tastatur erfragen?

    Hallo zusammen!
    Ich suche eine Möglichkeit im Programm abzufragen, welche Tasten gerade gedrückt sind.
    Dies geschieht außerhalb irgendwelcher KeyEvents. Ich dachte, Java stellt vielleicht eine statische Klasse dafür zur Verfügung (wie etwa MouseInfo bei der Maus), habe aber bislang nix finden können.
    Die Alternative bestünde darin, bei keyPressed und keyReleased jeweils Statusbits zu setzen und so den Status der relevanten Tasten selbst zu halten. Aber eine Java-unterstützte Lösung wäre natürlich viel schöner und übersichtlicher...

    Hat jemand eine Ahnung wie das gehen könnte?

  2. #2
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    afaik kannst du dem ganzen Fenster einen Keylistener zuordnen. Danach kannst du alle Tastatureingaben abfangen - selbstverständlich nur so lange das Fenster Fokus hat (du willst ja hoffentlich keinen keylogger proggen

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  3. #3
    Registrierter Benutzer
    Registriert seit
    17.11.2005
    Beiträge
    47
    Hm ja, danke erst mal bischi, aber wenn ich Dich richtig verstehe, war mir das schon klar.
    Das Ding ist ja das, dass ich zu irgendeinem (Event-unabhängigen Zeitpunkt) wissen möchte, ob bestimmte (Modifier-)Tasten gedrückt sind.
    Arbeite ich mit den Key-Events, muss ich ich die Liste der gedrückten Tasten (würde ich als Bitmaske realisieren) selber halten. Zudem entwickel ich nur eine Swing-Komponente und habe somit im Allgemeinen keinen Zugriff auf das Hauptfenster (was nach den Maßstäben der OO ja auch ganz richtig so ist).
    Und nebenher: schön ist die Lösung - wie ich schon meinte - nicht gerade.
    Zudem:
    Gedrückte Tasten sollten aber auch dann erkannt werden, wenn sie gedrückt wurden als eine andere Komponente den Fokus hatte. Mit meiner Komponente als KeyListener geht das natürlich nicht.

    Weitere Ideen sind sehr willkommen....

  4. #4
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von McFraggle
    Das Ding ist ja das, dass ich zu irgendeinem (Event-unabhängigen Zeitpunkt) wissen möchte, ob bestimmte (Modifier-)Tasten gedrückt sind.
    Also wenn eine Taste gedrückt wird - löst dies immer ein Event aus - die Frage ist nur, ob du das Event auch abfängst!
    Arbeite ich mit den Key-Events, muss ich ich die Liste der gedrückten Tasten (würde ich als Bitmaske realisieren) selber halten.
    Und sonst macht das Java von alleine?! Versteh jetzt leider nicht, was du meinst...
    Zudem entwickel ich nur eine Swing-Komponente und habe somit im Allgemeinen keinen Zugriff auf das Hauptfenster (was nach den Maßstäben der OO ja auch ganz richtig so ist).
    In diesem Fall könntest du ganz aggressiv immer den Fokus verlangen... Ist aber noch wesentlich unsauberer...
    Gedrückte Tasten sollten aber auch dann erkannt werden, wenn sie gedrückt wurden als eine andere Komponente den Fokus hatte. Mit meiner Komponente als KeyListener geht das natürlich nicht.
    Yepp.
    Weitere Ideen sind sehr willkommen....
    Andererseits: Ich nehm mal an, dass deine Komponente sich anders verhalten soll, je nachdem welche Taste gedrückt wird. Weiter nehm ich mal an, dass dies nur eine Rolle spielt, wenn auch etwas mit deiner Komponente gemacht wird. In diesem Fall hat die Komponente den Fokus. (wie soll eigentlich die Kommunikation mit anderen Komponenten funktionieren? Die müsste dann ja im "Hauptfenster" implementiert sein...). Daher könntest du deiner Komponente doch einen KeyListener spendieren und nur auf KeyPressed-Events reagieren (oder doch keyTyped? einfach die, wo eine Taste gedrückt ist und bleibt). Das sollte eigentlich gehen...

    MfG Bischi
    Geändert von bischi (21-03-2006 um 09:53 Uhr)

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  5. #5
    Registrierter Benutzer
    Registriert seit
    17.11.2005
    Beiträge
    47
    Hey bischi, ich glaube wir reden aneinader vorbei...
    Also:
    Also wenn eine Taste gedrückt wird - löst dies immer ein Event aus - die Frage ist nur, ob du das Event auch abfängst!
    Schon klar!
    Und sonst macht das Java von alleine?! Versteh jetzt leider nicht, was du meinst...
    Na ja, was heißt "von alleine"... Beispiel: Über MouseInfo.getPointerInfo.getLocation() bekommt man immer die derzeitigen Bildschirmkoordinaten des Mauszeigers. Ich hatte einfach gehofft, eine ähnliche statische Klasse würde Informationen zur Tastatur rausrücken...

    Du hast in so fern Recht, als das gedrückte Tasten nur dann relevant sind, wenn auch was mit der Komponente gemacht wird. Dann hat sie auch den Fokus. Klar. Aber folgendes Beispiel:
    • Die "vorhergehende" Komponente hat den Fokus.
    • Der Anwender drückt die Taste <a> und hält sie.
    • Der Anwender drückt TAB und der Fokus erreicht meine Komponente.
    • Der Anwender macht eine Drag-Operation mit der Maus und nun würde ich gerne wissen wollen, dass <a> gedrückt ist.

    Mit den "echten Modifiern" kann ich das machen, da sie im MouseEvent mitgeliefert werden. Allerdings könnte es sein, dass ich die Modifier auch innerhalb einer Behandlung eines ActionEvents, welches von einem Timer kommt, kennen muss. Zudem könnten eben auch andere Tasten als Modifier benötigt werden.
    Unterm Strich: Ich muss einfach für einen bestimmten Satz von Tasten immer wissen, ob sie gedrückt sind oder nicht!

    Wie ich mit dem KeyPressed-Event auf einen Tastendruck reagiere ist mir schon klar. Und auch, dass dieses Event während des Haltens der Taste periodisch kommt. Damit habe ich - wie ich auch schon erwähnt habe - die Möglichkeit den Status aller interessanten Tasten selber vorzuhalten. Eine einfache statische Abfrage über gedrückte Tasten wäre einfach die eleganteste Methode gewesen, vor allem weil so unter allen Umständen (wie etwa die Auflistung oben), ein verlässlicher Wert vorläge...

    Nun ja, auf diesen Luxus werde ich wohl verzichten müssen...

  6. #6
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von McFraggle
    Hey bischi, ich glaube wir reden aneinader vorbei...
    Schon möglich
    Na ja, was heißt "von alleine"... Beispiel: Über MouseInfo.getPointerInfo.getLocation() bekommt man immer die derzeitigen Bildschirmkoordinaten des Mauszeigers. Ich hatte einfach gehofft, eine ähnliche statische Klasse würde Informationen zur Tastatur rausrücken...
    Kannste ja problemlos selber proggen:

    Schematisch:

    Code:
    boolean Taste1;
    KeyListener{
     KeyPressed(KeyEvent ke){
      if(ke==Spezialtaste1){
       Taste1=true;
      }
     }
     KeyReleased(KeyEvent ke){
      if(ke==Spezialtaste1){
       Taste1=false;
      }
     }
    }
    Oder hab ich immer noch was falsch verstanden?

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  7. #7
    Registrierter Benutzer
    Registriert seit
    17.11.2005
    Beiträge
    47
    Nö, hast mich schon richtig verstanden, nur nicht vollständig. Genau DAS habe ich vor. Nur statt boolsch'en Variablen wollte ich ein Statuswort nutzen und für die Tasten entsprechende Bitmasken. Aber ganz genau das hab ich vor.

    Nur löst diese Ausweichmöglichkeit eben nicht das (zugegebenermaßen sehr konstruierte) Problem, welches ich in der Aufzählung beschrieben habe, nämlich das Drücken einer Taste vor dem Aktivieren meiner Komponente, bzw. dem Loslassen einer Taste nach dem Deaktivieren meiner Komponente. Dazu kommt dann wie erwähnt der ästhetische Aspekt.

    Aber lass gut sein... Danke für die Unterstützung.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •