【问题标题】:Keyboard input stops working in Swing application (a calculator) after clicking on a JButton单击 JButton 后,键盘输入在 Swing 应用程序(计算器)中停止工作
【发布时间】:2012-11-27 08:05:42
【问题描述】:

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

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

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

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

setFocusable(true);

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

【问题讨论】:

    标签: java swing jbutton calculator keylistener


    【解决方案1】:

    Swing 组件是轻量级并使用KeyBindings,其中KeyListeners 用于重量级的 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()

    【讨论】:

    • //do something when d is pressed == 需要添加JButton#doClick()
    • @mKorbel 非常真实 +1 添加了它
    • 从技术上讲,KeyListener 不限于重量级组件,但它确实存在焦点问题 - 即注册的组件必须具有焦点才能接收键事件,键绑定 API 可以用来克服的。但是,+1 键绑定使用
    • 非常感谢。我决定使用您的“hacky 解决方案”,因为它对我来说更简单。也感谢 KeyBindings 的解释。
    【解决方案2】:

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

    myJbutton.setFocusable(false);
    

    这对我有用。

    【讨论】:

    • 不是一个好主意:这会使键盘无法访问按钮,从而违反可用性最佳实践(所有交互都必须通过鼠标和键盘进行)
    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多