4

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

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

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

我怀疑问题出在焦点上,但这不是我可以通过单击应用程序的任意位置来解决的问题。我添加了以下代码:

setFocusable(true);

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

4

2 回答 2

4

Swing 组件是轻量级的并且可以使用KeyBindings,其中s 代表重量级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()侦听器所附加的组件(例如在按钮单击后等)

于 2012-12-09T21:35:37.040 回答
1

这是另一种 hacky 方法,但是您可以在创建 JButton 时更改它的属性,以便它不能首先获得焦点,即:

myJbutton.setFocusable(false);

这对我有用。

于 2013-07-03T11:30:44.060 回答