2016-05-10 2 views
1
Action tab = new AbstractAction() { 
     public void actionPerformed(ActionEvent e) {  
      System.err.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); 
     } 
    }; 

Game.panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("Tab"), "tab"); 
Game.panel.getActionMap().put("tab", tab); 

Wie auch immer es nicht druckt. Dies ist die gleiche Einstellung, die ich für alle meine anderen Tasten verwende, aber ich kann die Tab-Taste nicht funktionieren. Ich habe versucht "TAB", "Tab" und "tab".Hinzufügen von TAB-Taste Java Swing Keybindings --- Was ist der richtige Name?

Wie lautet der korrekte Name? Oder gibt es etwas Besonderes?

+0

persönlich bevorzugen 'KeyStroke .getKeyStroke (KeyEvent.VK_TAB, 0) 'selbst – MadProgrammer

Antwort

3

Sie wollen wahrscheinlich:

KeyStroke.getKeyStroke('\t'); 

\t is the escape sequence für die TAB character (0x09), die Ausgabe von tab on your keyboard drücken ist.

Es gibt auch KeyEvent.VK_TAB, die je nach Anwendungsfall vorzuziehen sind. In der Dokumentation unter KeyEvent finden Sie mehr darüber, warum Sie das eine oder das andere bevorzugen sollten.

+0

THANKKKK YOUUU. –

+0

Wie würdest du ein veröffentlichtes '\ t' einbauen? –

+0

@MitchWeaver sollte nicht anders sein als jeder andere Schlüssel - registrieren Sie einen 'KeyListener', der [' .keyReleased() '] überschreibt (https://docs.oracle.com/javase/8/docs/api/java/awt /event/KeyListener.html#keyReleased-java.awt.event.KeyEvent-). Im Allgemeinen ist es besser, neue Fragen zu stellen, als Follow-ups in Kommentaren zu stellen. – dimo414

1

Ich bin überrascht, dass KeyStroke für Sie funktioniert, da das Tab-Zeichen im Allgemeinen von dem Fokus-Subsystem behandelt wird.

Es funktioniert nicht für mich. Ich verwende JDK8 unter Windows 7:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TabSSCCE extends JPanel 
{ 
    public TabSSCCE() 
    { 
     Action tab = new AbstractAction() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       System.out.println("key typed"); 
      } 
     }; 

     getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('1'), "typed"); 
     getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('a'), "typed"); 
     getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('\t'), "typed"); 
     getActionMap().put("typed", tab); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("TabSSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TabSSCCE()); 
     frame.setLocationByPlatform(true); 
     frame.setSize(100, 100); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 

Funktioniert der obige Code für Sie?

Nur die "1" und "a" funktionieren für mich. Die Tab-Taste funktioniert nicht für mich.

Wenn nicht, können Sie dann eine einfache SSCCE veröffentlichen, die zeigt, wie Sie diese verwenden?

Edit:

Der obige Code wird mit einem der folgenden arbeiten:

frame.setVisible(true); 
frame.setFocusTraversalKeysEnabled(false); 

oder Sie können die Fokus-Traversal-Tasten für das Panel deaktivieren:

public TabSSCCE() 
{ 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false); 

    ... 
} 
+0

ja es tut, so mache ich alle meine Schlüssel, genau wie es in meiner Frage ist . Ich bin auf Linux, 8, aber mein Spiel funktioniert auch gut auf Win/Mac. Nicht sicher, was Sie Problem sind, ist ehrlich gesagt. –

+0

@MitchWeaver, ich sollte klarstellen, die "1" und "a" funktionieren für mich, aber das "\ t" nicht. Ich vermute, ich schlage vor, dass Sie nicht versuchen sollten, die Tab-Taste zu handhaben, da das Fokus-Traversal-System diese Taste abfängt. Der Code funktioniert nicht unter Windows, sodass Sie keine plattformunabhängige Lösung haben. – camickr

+0

ahhh Ich sehe, ja ich habe die Registerkarte nicht getestet, wie ich es gerade erst implementiert habe. Funktioniert 'getKeyStroke (KeyEvent.VK_TAB, KeyEvent.KEY_PRESSED)' für Sie anstatt '" \ t "' vielleicht? –

Verwandte Themen