我正在使用Swing制作计算器。到目前为止,我已经创建了一个由带有BorderLayout的JFrame组成的GUI,并在其中心放置了一个JPLnel,它有一个JLabel(代表计算器的屏幕)和一些JButtons(代表键)。
我希望计算器能够直接从键盘接收输入,因此我将方法addKeyListener包含在扩展JFrame的类中,并将参数作为参数添加到实现KeyListener的类的对象。
当我运行应用程序时,它接受键盘输入,直到我点击其中一个JButton。之后使用键盘不再起作用。
我怀疑问题是关注焦点,但是我可以通过单击应用程序上的任何位置来修复问题。我添加了以下代码:
setFocusable(true);
到JFrame但它没有帮助。我已经读过使用Key Bindings可能是比使用KeyListener更好的选择,但我不确定这种方法。
答案 0 :(得分:3)
Swing组件轻量级并使用KeyBindings
,其中KeyListener
用于重量级的AWT组件。并且在与Swing组件混合时已知具有焦点问题。因此我建议改为KeyBindings
(但我知道你已经听过了)。你可以使用它们:
final JButton b=..;
//method to add keybindings to a JComponent ie JButton,JPanel,JTextField etc
private void addKeyBindings(JComponent jc) {
//not the getInputMap(..) call it could also be JComponent.WHEN_FOCUSED etc
jc.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("D"), "D pressed");
jc.getActionMap().put("D pressed", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
//do something when d is pressed
b.doClick();
}
});
}
对于一般知识,一个非常hacky的解决方案就是在焦点丢失时(例如点击按钮之后等)将侦听器连接到的组件上调用requestFocusInWindow()
答案 1 :(得分:1)
这是另一种hacky方法,但你可以在创建它时改变JButton的属性,这样它就不能把焦点放在第一位,即:
myJbutton.setFocusable(false);
这对我有用。