wake-up-neo.net

Wie kann ein KeyListener Tastenkombinationen erkennen (z. B. ALT + 1 + 1)

Wie kann ich meine benutzerdefinierte KeyListener auf Kombinationen von ALT (oder CTRL für diese Angelegenheit) + mehr als einen anderen Schlüssel warten lassen?

Angenommen, ich habe 11 verschiedene Aktionen, die die Anwendung ausführen soll, abhängig von einer Tastenkombination. ALT + 0 - ALT + 9 stellt offensichtlich keine Probleme dar, wohingegen ich für ALT + 1 + 0 (oder "ALT + 10", wie es in einer Hilfedatei oder in ähnlicher Weise beschrieben werden könnte) im Web (oder in meinem Kopf) keine gute Lösung finden kann. Ich bin nicht überzeugt, dass diese Lösung mit einem Timer der einzig mögliche Weg ist.

Vielen Dank im Voraus für jede Anregung!

Bearbeiten: Aktionen 0-9 + Aktion 10 = 11 Aktionen. Danke @ X-Zero.

19
s.d

Sie sollten KeyListener nicht für diese Art der Interaktion verwenden. Verwenden Sie stattdessen Schlüsselbindungen, die Sie im Java Tutorial nachlesen können. Dann können Sie die Maske InputEvent verwenden, um darzustellen, wann die verschiedenen Modifizierungstasten gedrückt werden. Zum Beispiel:

// Component that you want listening to your key
JComponent component = ...;
component.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
                            Java.awt.event.InputEvent.CTRL_DOWN_MASK),
                    "actionMapKey");
component.getActionMap().put("actionMapKey",
                     someAction);

Im Javadoc für KeyStroke finden Sie die verschiedenen Codes, die Sie beim Abrufen der KeyStroke verwenden können. Diese Modifikatoren können miteinander ODER-verknüpft werden, um verschiedene Tastenkombinationen darzustellen. Sowie

KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
                       Java.awt.event.InputEvent.CTRL_DOWN_MASK
                       | Java.awt.event.InputEvent.SHIFT_DOWN_MASK)

Um darzustellen, wann die Ctrl + Shift-Tasten gedrückt wurden.

Edit: Wie bereits erwähnt, beantwortet dies Ihre Frage nicht, sondern sollte nur als guter Rat betrachtet werden.

26

Sie können KeyListener für diesen Zweck verwenden, indem Sie bestimmte Dinge kombinieren. Schauen Sie sich das folgende Beispiel an, das in eine überschriebene Methode keyPressed(KeyEvent e) gestellt werden sollte.

if (e.isControlDown() && e.getKeyChar() != 'a' && e.getKeyCode() == 65) {
        System.out.println("Select All"); 
}

Die Zeichenfolge Select All wird angezeigt, wenn Ctrl + a wird gedrückt. Die Methode e.isControlDown() prüft, ob die Ctrl Taste gedrückt oder nicht. Ebenso die Alt Tastenkombinationen können mit derselben Methode ausgeführt werden, indem die Methode e.isAltDown() verwendet wird.

Die Logik dahinter ist, dass e.getKeyChar() das Zeichen des Tastendrucks zurückgibt & e.getKeyCode() seinen ASCII Code zurückgibt. Wann Ctrl gedrückt halten, die e.getKeyChar() gibt a nicht zurück und e.getKeyCode() ist derselbe 65. Ich hoffe du verstehst das. Fühlen Sie sich frei, mehr zu fragen.

19
Sasivarnan

ALT + 1 + 0 (oder "ALT + 10", wie es in einer Hilfedatei oder ähnlich beschrieben werden könnte)

scheint mit (aus einem Ihrer Kommentare) zu kollidieren:

Wenn der Benutzer beispielsweise Daten in Spalte 11 ändern möchte (was als "10" bezeichnet werden würde), würde er/sie ALT + 1 + [drücken] [ALT und 1] 0 drücken.

Angenommen, ALT + 10 bedeutet 'Drücken von ALT, Drücken und Loslassen von 1, Drücken und Loslassen von 0, Loslassen von ALT'. Ich schlage vor, Folgendes zu versuchen:

Hören Sie in keyPressed auf die ALT-Taste, aktivieren Sie ein boolesches Flag, isAltPressed, und erstellen Sie einen Puffer zum Halten von Tastendrücken (beispielsweise eine Zeichenfolge). Wenn in keyTyped isAltPressed aktiv ist, hängen Sie Schlüsselcodes an den Puffer an . Wenn Sie in keyReleased erneut auf ALT warten, öffnen Sie eine Bedingung, die den Puffer abfragt und Aktionen ausführt.

    public void keyPressed (KeyEvent e){
        if (e.getKeyCode() == KeyEvent.VK_ALT){
        buffer = ""; //declared globally
        isAltPressed = true; } //declared globally
    }

    public void keyTyped (KeyEvent e){
        if (isAltPressed)
            buffer.append (e.getKeyChar());
    }

    public void keyReleased (KeyEvent e){
        if (e.getKeyCode() == KeyEvent.VK_ALT){
            isAltPressed = false;
            if (buffer.equals (4948)) //for pressing "1" and then "0"
                doAction();
            else if (buffer.equals(...))
                doOtherAction();
            ...
        }//if alt
    }
2
sideways8

Ich denke, es gibt einen einfacheren Weg, den ich benutze. Wenn das KeyEvent ev ist, untersuchen Sie Folgendes:

(int)ev.getKeyChar()

du findest das ctrl-a ist 1, ctrl-b ist 2 und so weiter. Ich wollte benutzen ctrl-s zum Speichern. Also benutze ich einfach:

(((int)ev.getKeyChar())==19)

um es zu erkennen. Keine Ahnung warum, aber es funktioniert gut während:

ev.isControlDown() && ev.getKeyChar()=='s'

nicht.

0
dave110022

Ich würde vorschlagen, anstelle von Tastenkombinationen ein Eingabefeld zu betrachten, wenn das Fenster isVisible() und fokussiert ist. Das Feld kann ausgeblendet werden, z. B. die Suche nach versteckten Dateinamen im Windows Explorer (geben Sie ein Verzeichnis ein, geben Sie den Dateinamen und die Korrespondenz ist fokussiert) oder ist wie in Ubuntu sichtbar. 

Tastenkombinationen sind nicht dafür ausgelegt, mehr als eine andere Taste als Modifizierer aufzunehmen, obwohl dies möglicherweise möglich ist.

0
WesternGun
import Java.awt.*;
import Java.awt.event.*;
class KDemo
{
     public static void main(String args[])
     {
           Frame f = new Frame();
           f.setSize(500,500);
           f.setVisible(true);
           f.addKeyListener(new KeyAdapter()
           {
               public void keyPressed(KeyEvent e)
               {
                   AWTKeyStroke ak = AWTKeyStroke.getAWTKeyStrokeForEvent(e);
                   if(ak.equals(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK)))
                   {
                     System.exit(0);
                   }
               }
           });
        }
   }
0
Venkat Esan