2

首先,这不是用于键盘记录器,而是用于 roguelike 游戏中的输入,其中JLabelJFrame会说“名称:”并且我希望能够键入 A-Za-z。在查看了许多按键输入选项之后,我又回到了开始使用KeyStrokes 和Actions 的地方。

我想知道是否有办法添加一系列键,而不是重复 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几天,所以这就是为什么我可能错过了一个非常普遍的解决方案,但如果有的话,请分享!赞赏。

4

2 回答 2

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);
}

但我认为你应该更喜欢JTextFieldwith DocumentListener

于 2012-07-03T10:07:19.843 回答
0

我正在使用一个内容管理器类,它将每个“屏幕”视为JPanel设置为内容窗格的一个,我将对父 JFrame 的引用放入基本“屏幕”类,然后将一个添加KeyListener到父 JFrame。这可以捕获我想要的输入。我之前没有这样做,因为我错误地将 添加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!

于 2012-07-03T10:29:20.607 回答