2017-04-15 2 views
0

derzeit versuche ich, ein Raster basiertes Spiel zu codieren. Es ist mir bereits gelungen, einen Key-Listener für die allgemeine Navigation zu implementieren. Wenn Sie jedoch eine bestimmte Taste drücken, wird ein Jpopup-Menü geöffnet.Mehrere Keylisteners Java

Jetzt möchte ich die Navigation für das Menü auch mit einem Key-Listener zu implementieren. Drücken von B soll das Menü wieder schließen.

KeyListener UnitActionMenuKeyListener = new KeyListener()   { 
    @Override 
    public void keyPressed(KeyEvent evt) 
    { 

    if (evt.getKeyCode()==KeyEvent.VK_B) 

     menu.setVisible(false) 
    } 

    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    JPopupMenu menu = new JPopupMenu("UnitActionMenu"); 
    JMenuItem bewegenItem = menu.add("test"); 

Verwendung von menu.show und menu.addKeyListener danach.

Aber egal was ich versuche, entweder meine allgemeine Navigation arbeitet gewohnt mehr, oder die allgemeine Navigation funktioniert, aber mein Menü reagiert gewohnt zu drücken B

so, wie ich mehrere Schlüssel Hörer für mehrere Elemente implementieren kann ? i mein Hauptfenster nur hören wollen (und reagiert) bis zu einem gewissen Schlüssel anders als mein Menü

(sorry für schlecht geschrieben, mein Englisch ist nicht so gut und im frustriert durch eine einfache Aufgabe für mehr als 4 Stunden versagt)

Antwort

1

Swing-Key-Bindungen sind im Allgemeinen besser als Key-Listener. Key-Listener haben Probleme mit dem Fokus-System. Das ist das Problem, das Sie haben. Wenn das Popup aktiv ist, stiehlt es den Fokus. Nur die fokussierte Komponente sendet wichtige Ereignisse.

Es gibt eine Anleitung für Tastenbelegungen hier: https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

Die API ist ein wenig komplizierter ist, aber sie sind robuster und Sie können den Fokus Verhalten direkt angeben.


Hier finden Sie eine Kurzanleitung zum Konvertieren von Key Listeners in Tastenbelegungen.

Für einen Schlüssel Zuhörer, Sie Code haben, der wie folgt ist:

myComponent.addKeyListener(new KeyListener() { 
    ... 
    @Override 
    public void keyTyped(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_Z) 
      performZAction(); 
    } 
}); 

einen Schlüssel Schreiben wie das wäre Bindung:

KeyStroke keystroke = 
    KeyStroke.getKeyStroke("typed Z"); 
myComponent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
    .put(keystroke, "zAction"); 
myComponent.getActionMap() 
    .put("zAction", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      performZAction(); 
     } 
    }); 

Mit anderen Worten gibt es drei Schritte:

  1. Erstellen eines Objekts javax.swing.KeyStroke mit KeyStroke.getKeyStroke.
  2. Verwenden Sie die Eingabezuordnung, binden Sie den Tastenanschlag an einen Namen für Ihre Aktion.
  3. Verwenden Sie die Aktionskarte, um den Namen für Ihre Aktion an javax.swing.Action zu binden.

Die Action ist Ihr Hörer. Sie können javax.swing.AbstractAction erweitern und es ist wie das Schreiben einer ActionListener.

+0

Leider verstehe ich nicht, wie Tastenkombinationen funktionieren. Die angegebenen Beispiele sind ziemlich kompliziert. das Menü, das ich verwenden möchte, ist im Fokus und vordefinierte Tastaturkürzel (wie Navigieren mit der Pfeiltaste) funktionieren. meine eigene Tastenanbindung/Hörer (mit B zu beenden) funktioniert nicht – qwpeo

+0

@qwpeo Sehen Sie, ob meine Bearbeitung hilft. – Radiodef