使用KeyStroke进行输入,是否有更简单的方法来读取A-Z键?

时间:2012-07-03 09:56:00

标签: java swing java-io roguelike

首先,这不适用于键盘记录器,而是用于roguelike游戏中的输入,JLabel中的JFrame会说“名称:”而我希望能够型号A-Za-z。看了很多键输入选项后,我回到了开始使用KeyStrokeAction s的位置。

我想知道的是,是否有办法添加一系列键,而不是重复这56次:

Action a = new AbstractAction() {

    public void actionPerformed(ActionEvent e) {
        // add a to string
    }
};
getInputMap().put(KeyStroke.getKeyStroke("a"), "a");
getActionMap().put("a", a);

我的意思是,我可以这样做,只是写一些副本和粘贴,但我真的很讨厌。必须有一个比使用KeyListener更优雅的解决方案,这不是很好,因为它意味着我必须以某种方式有焦点,但我的窗口只是一个JFrame,其中有一个大的JLabel

另外,我现在只做了几天java,这就是为什么我可能错过了一个非常常见的解决方案,但是如果有的话,请分享!赞赏。

2 个答案:

答案 0 :(得分:1)

这是一个解决方案:

for (char c = 'a'; c <= 'z'; c++) {
    String ks = String.valueOf(c);
    getInputMap().put(KeyStroke.getKeyStroke(ks), ks);
    getActionMap().put(ks, a);
    ks = ks.toUpperCase();
    getInputMap().put(KeyStroke.getKeyStroke(ks), ks);
    getActionMap().put(ks, a);
}

但我认为您应该选择JTextField DocumentListener

答案 1 :(得分:0)

我正在使用一个内容管理器类,它将每个“屏幕”视为JPanel,它被设置为内容窗格,我将对父JFrame的引用放入基本“屏幕”类中,然后添加了一个父{JFrame} KeyListener。这捕获了我想要的输入。之前我没有这样做,因为我错误地将KeyListener添加到内容窗格中。这一切现在看起来都很好。

public void run() {
    this.getParent().addKeyListener(new KeyListener() {

        public void keyPressed(KeyEvent e) {
            appendLabel(e.getKeyChar());
        }

        public void keyReleased(KeyEvent e) { }
        public void keyTyped(KeyEvent e) { }
    });
}

谢谢@millimoose!