首先,这不适用于键盘记录器,而是用于roguelike游戏中的输入,JLabel
中的JFrame
会说“名称:”而我希望能够型号A-Za-z。看了很多键输入选项后,我回到了开始使用KeyStroke
和Action
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,这就是为什么我可能错过了一个非常常见的解决方案,但是如果有的话,请分享!赞赏。
答案 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!