在单击JButton后,键盘输入在Swing应用程序(计算器)中停止工作

时间:2012-12-09 21:24:04

标签: java swing jbutton calculator keylistener

我正在使用Swing制作计算器。到目前为止,我已经创建了一个由带有BorderLayout的JFrame组成的GUI,并在其中心放置了一个JPLnel,它有一个JLabel(代表计算器的屏幕)和一些JButtons(代表键)。

我希望计算器能够直接从键盘接收输入,因此我将方法addKeyListener包含在扩展JFrame的类中,并将参数作为参数添加到实现KeyListener的类的对象。

当我运行应用程序时,它接受键盘输入,直到我点击其中一个JButton。之后使用键盘不再起作用。

我怀疑问题是关注焦点,但是我可以通过单击应用程序上的任何位置来修复问题。我添加了以下代码:

setFocusable(true);

到JFrame但它没有帮助。我已经读过使用Key Bindings可能是比使用KeyListener更好的选择,但我不确定这种方法。

2 个答案:

答案 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);

这对我有用。