添加TAB键java swing键绑定——正确的名称是什么?

添加TAB键java swing键绑定——正确的名称是什么?,java,swing,key-bindings,Java,Swing,Key Bindings,但它不是印刷品。这与我用于所有其他键的设置相同,但我无法使tab键工作。我试过了“TAB”,“TAB”,和“TAB” 它的正确名称是什么?或者有什么特别的吗?您可能想要: Action tab = new AbstractAction() { public void actionPerformed(ActionEvent e) { System.err.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

但它不是印刷品。这与我用于所有其他键的设置相同,但我无法使tab键工作。我试过了
“TAB”
“TAB”
,和
“TAB”

它的正确名称是什么?或者有什么特别的吗?

您可能想要:

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);
对于,按可输出


根据您的用例,还有一些更可取的方法。请参阅
KeyEvent
中的文档,了解为什么您应该选择其中一个或另一个。

由于制表符通常由焦点子系统处理,所以我很惊讶击键对您有效

这对我不起作用。我在Windows 7上使用JDK8:

KeyStroke.getKeyStroke('\t');
上面的代码对你有用吗

只有“1”和“a”适合我。Tab键对我不起作用

如果没有,那么你能发布一个简单的SSCCE来展示你是如何使用它的吗

编辑:

上述代码将与以下任一项一起使用:

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();
            }
        });
*/
    }
}
或者,您可以禁用面板的焦点遍历键:

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

您将如何合并已发布的“\t”?@MitchWeaver它应该与覆盖的任何其他密钥-注册一个
KeyListener
。总的来说,发布新问题比在评论中询问后续问题要好。我的糟糕之处在于,我的想法正好相反,发布另一个问题是不礼貌的。不管怎样,有没有一种方法比
keylister
更能坚持使用
keybindings
方法呢?关键听众的速度较慢,而且可以表现得很时髦,这不是游戏的最佳选择。@MitchWeaver我绝对建议你在另一个问题中问这个问题(更详细),我不确定你指的是什么。我只是在尝试。是的,它更易于使用,并且确实解决了我发布的问题:
getKeyStroke(KeyEvent.VK_选项卡,KeyEvent.KEY_发布)
是的,这就是我所有按键的方式,与我的问题完全一样。我使用的是linux,8,但我的游戏在win/mac上也运行良好。老实说,我不确定你的问题是什么。@MitchWeaver,我应该澄清,“1”和“a”对我有用,但“\t”不起作用。我想我的意思是,您不应该试图处理Tab键,因为焦点遍历系统会截取这个键。该代码在Windows上不工作,因此您没有独立于平台的解决方案。啊,我明白了,是的,我没有测试该选项卡,因为我刚刚实现了它。
getKeyStroke(KeyEvent.VK\u选项卡,KeyEvent.KEY\u按下)
“\t”
更适合你吗?@MitchWeaver,不,这种方法对我也不适用。我想找到了解决方案!将其放在声明组件的位置:
setFocusTraversalKeysEnabled(false)
个人更喜欢
KeyStroke.getKeyStroke(KeyEvent.VK_选项卡,0)
我自己
public TabSSCCE()
{
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);

    ...
}