Etwas, das Sie tun können, ist die KeyListener
-Schnittstelle implementieren und geben Zustände zu allen Tasten, die Sie interessieren.
Wenn Sie bei der Prüfung interessiert sind, wenn Sie die Pfeiltasten auf einem Screenshot gedrückt werden, zum Beispiel, Sie können diese KeyListener
Schnittstelle implementieren und die Methoden keyPressed()
und keyReleased()
überschreiben und den Status für die Schlüssel, an denen Sie interessiert sind, auf keyPressed
oder keyReleased
setzen. Abhängig von der Veranstaltung. Wenn der Screenshot auftritt, können Sie einfach den Status dieser Schlüssel lesen
Wenn Sie diese Lösung global unabhängig vom Anwendungsfokus benötigen, können Sie einen kleinen Haken in C schreiben, den Sie in Java Native integrieren können Schnittstelle zum Abhören wichtiger Ereignisse. Java lässt Sie keine Schlüsselereignisse abhören, ohne dass Sie den Listener an eine Komponente und die Komponente mit Fokus gebunden haben. Schauen Sie sich JNativeHook an.
Wenn Sie es nur brauchen, wenn Ihre Anwendung den Fokus hat, aber auf jeder Komponente, können Sie den Listener unelegant an alle Ihre Komponenten anhängen oder Sie könnten Ihren eigenen KeyEventDispatcher schreiben und ihn im KeyBoardFocusManager registrieren. Auf diese Weise können Sie alle Tastaturereignisse abfangen, unabhängig davon, welche Komponente einen bestimmten Fokus hat. Siehe:
public class YourFrame extends JFrame {
public YourFrame() {
// Finish all your layout and add your components
//
// Get the KeyboardFocusManager and register your custom dispatcher
KeyboardFocusManager m = KeyboardFocusManager.getCurrentKeyboardFocusManager();
m.addKeyEventDispatcher(new YourDispatcher());
}
private class YourDispatcher implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_TYPED) {
// Do something to change the state of the key
} else if (e.getID() == KeyEvent.KEY_PRESSED) {
// Do something else
}
return false;
}
}
public static void main(String[] args) {
YourFrame yF = new YourFrame();
yF.pack();
yF.setVisible(true);
}
}
Danke für die schnelle Antwort! Ich werde es jetzt ausprobieren - klingt, als sollte es funktionieren. – zergylord
Das Lesen der Schnittstelle lässt es so klingen, dass es nur die Schlüssel abfängt, wenn eine bestimmte J-Komponente den Fokus hat, was ich nicht suche. Ich möchte auf Tasten gedrückt * global * aka unabhängig von Fokus hören. Gibt es einen Weg für Ihre vorgeschlagene Lösung, dies zu tun? – zergylord
Ich glaube nicht, dass Java Ihnen diese Art von Kontrolle geben wird - dh die Implementierung eines KeyListeners unabhängig vom Anwendungsfokus. Der beste Weg wäre, einen globalen Listener in einer Sprache zu schreiben, die näher an dem von Ihnen verwendeten Betriebssystem ist, wie C. Verwenden Sie dann Java Native Interface für die Integration mit den Schlüsselereignissen von C. – ugo