Java 在NetBeans中为计算器使用KeyListener

Java 在NetBeans中为计算器使用KeyListener,java,swing,keylistener,keyevent,actionevent,Java,Swing,Keylistener,Keyevent,Actionevent,我用NetBeans编写了一个计算器,它的功能非常完美。然而,我必须实际点击按钮来插入数字,我正试图用一个KeyListener来解决这个问题。我所有的数字和功能按钮都设置在一个名为buttons的JPanel中。我在一个名为display的JPanel中有我的显示标签 我将我的类设置为实现KeyListener,它插入了KeyPressed、type和release方法;但我还是坚持了下来。我不知道如何让我的按钮真正听到按键事件,当它听到事件时,激活按钮。此外,我的按钮按编号命名(例如,零按钮

我用NetBeans编写了一个计算器,它的功能非常完美。然而,我必须实际点击按钮来插入数字,我正试图用一个KeyListener来解决这个问题。我所有的数字和功能按钮都设置在一个名为buttons的JPanel中。我在一个名为display的JPanel中有我的显示标签

我将我的类设置为实现KeyListener,它插入了KeyPressed、type和release方法;但我还是坚持了下来。我不知道如何让我的按钮真正听到按键事件,当它听到事件时,激活按钮。此外,我的按钮按编号命名(例如,零按钮命名为零,一按钮命名为一,等等)

我已经读到,您实际上必须通过使用:something.addKeyListener(something); 但我似乎无法理解这一点

我能在这里得到一些帮助吗?我是Java新手,这是我的第一个单独项目。如果我没有提供足够的信息,请告诉我

编辑:我的大部分代码都是NetBeans生成的,我无法编辑组件的初始化,我想这似乎是我的问题

我的班级宣言:

public class Calculator extends javax.swing.JFrame implements KeyListener {
 //Creates new form Calculator
public Calculator() {
    initComponents();
}
我按下按钮的一个动作(与实际数字的更改完全相同):

NetBeans提供的主要方法:

public static void main(String args[]) {
    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Calculator().setVisible(true);
        }
    });
}

生成的initComponents()netbeans非常庞大(大约500行代码),我无法编辑其中任何一行。如果我能提供更多有用的信息,请告诉我

我不确定我是否完全理解您的问题,有些代码可能会有所帮助,但我想尝试一下,因为这听起来像是我以前经常遇到的问题

这听起来像是你的按键没有被识别的原因是你的注意力集中在其中一个按钮上。如果将KeyListener添加到按钮,则不会有任何问题。 在netbeans中,您可以通过设计屏幕非常轻松地添加KeyListener。 下面的图片显示了如何将按键侦听器添加到jPanel中的按钮

private void jButton1KeyPressed(java.awt.event.KeyEvent evt) {                                    
    //Check which key is pressed
    //do whatever you need to do with the keypressed information
}       

能够自己写出听众的话是很好的,但是如果你只是在学习,那么得到尽可能多的帮助也是很好的。 这可能不是最好的解决方案,因为您必须为每个按钮添加侦听器

是否存在焦点问题?如果存在,我如何解决该问题

是的,可能有一个焦点问题。这就是为什么您不应该使用KeyListener

Swing设计用于键绑定。也就是说,你创建了一个你想要的动作。然后可以将此操作添加到JButton。它也可以绑定到击键。所以你有很好的可重用代码


有关详细信息,请阅读上的Swing教程。键绑定没有您当前遇到的焦点问题。

您可以发布代码吗?您是否已经学习过任何教程?这里有一个:我发布了一些代码。我已经学习了大约4个不同的教程,包括您列出的教程。我似乎不明白。他们正在JComponent上创建一个新的KeyListener,但我似乎无法这样做。您可能希望将所有键的KeyListener添加到内容面板,而不是每个按钮。如果我将其添加到内容面板(我的按钮面板),我需要面板请求焦点,对吗?如果是这样,我该怎么做?我注意到许多涉及focus和read的属性,您必须调用requestFocus()方法?好的,我实现了这一点,并试图简单地将KeyCode打印到控制台以测试它是否有效,但它没有。System.out.println(“代码:evt.getKeyCode());可能有焦点问题吗?如果有,我如何解决这个问题?我不完全确定,尽管您刚才编写的代码缺少一个“+”符号。好的,我正在取得进展。当我运行我的应用程序时,我注意到我的7键有一个蓝色边框,我想这意味着它是专注的——事实上它是。但如果这是唯一一个有焦点的按钮,这是唯一一个能够检测按键按下的按钮,如果我按下另一个键,焦点就会转移。所以把焦点放在容器上会很好,对吗?如果是这样,我该怎么做呢?就像我在上面的回答中提到的,这可能不是最好的解决方案。当我用Java制作应用程序时,我通常做的是将KeyListener添加到容器以及所有按钮中,这样,无论关注什么,应用程序都会检测到按键。问题已经解决。非常感谢,这帮了我很多忙。我已经研究了一整天了。标记作为答案。
private void jButton1KeyPressed(java.awt.event.KeyEvent evt) {                                    
    //Check which key is pressed
    //do whatever you need to do with the keypressed information
}