【问题标题】:Using KeyListener for a Calculator in NetBeans在 NetBeans 中将 KeyListener 用于计算器
【发布时间】:2013-06-02 02:46:39
【问题描述】:

我在 NetBeans 中编写了一个计算器,它运行良好。但是,我必须实际单击按钮来插入数字,并尝试使用 KeyListener 来解决这个问题。我将所有数字和功能按钮都设置在一个名为按钮的 JPanel 中。我在一个名为 display 的 JPanel 中有我的显示标签。

我将我的类设置为实现 KeyListener,它插入了 KeyPressed、-Typed 和 -Released 方法;但是我从那里卡住了。我不确定如何让我的按钮真正监听 KeyPressed 事件,以及当它听到事件时 - 激活按钮。此外,我的按钮以编号命名(例如,零按钮被命名为零,一个按钮被命名为一,等等)。

我读到你实际上必须在某处使用以下方法实现 KeyListener:something.addKeyListener(something); 但我似乎无法弄清楚这一点。

我可以在这里寻求帮助吗?我是 Java 新手,这是我的第一个个人项目。如果我没有提供足够的信息,请告诉我。

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

我的班级声明:

public class Calculator extends javax.swing.JFrame implements KeyListener {
 //Creates new form Calculator
public Calculator() {
    initComponents();
}

我的一个 buttonPressed 动作(都与实际数字的变化相同):

private void zeroActionPerformed(java.awt.event.ActionEvent evt) {                                     
    if (display.getText().length() >= 16)
    {
        JOptionPane.showMessageDialog(null, "Cannot Handle > 16 digits");
        return;
    }
    else if (display.getText().equals("0"))
    {
        return;
    }
    display.setText(display.getText().concat("0"));

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 行代码),我无法对其进行任何编辑。如果我能提供更多有用的信息,请告诉我。

【问题讨论】:

  • 你可以发布你的代码吗?
  • 您完成过任何教程吗?这是一个:docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html
  • 我发布了一些代码。我遵循了大约 4 个不同的教程,包括你列出的那个。我似乎无法弄清楚。他们正在 JComponent 上创建一个新的 KeyListener,但我似乎做不到。
  • 您可能希望将 所有键 的键侦听器添加到内容面板,而不是每个单独的按钮。
  • 如果我将它添加到我的内容面板(我的按钮面板),我需要让面板请求焦点,对吗?如果是这样,我该怎么做?我注意到很多涉及焦点的属性,并且读到必须调用 requestFocus() 方法?

标签: java swing keylistener keyevent actionevent


【解决方案1】:

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

是的,焦点可能存在问题。这就是为什么你不应该使用 KeyListener。

Swing 旨在与键绑定一起使用。那就是您创建一个执行您想要的操作的操作。然后可以将此 Action 添加到您的 JButton。它也可以绑定到 KeyStroke。所以你有很好的可重用代码。

阅读How to Use Key Bindings 上的 Swing 教程以获取更多信息。 Key Bindings 没有您目前遇到的焦点问题。

【讨论】:

    【解决方案2】:

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

    听起来您的按键未被识别的原因是焦点位于其中一个按钮上。如果您将按键侦听器添加到按钮,那么您应该没有任何问题。 在 netbeans 中,您可以非常轻松地通过设计屏幕添加按键侦听器。 这是一张图片,展示了如何将 keyPressed 侦听器添加到 jPanel 中的按钮。

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

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

    【讨论】:

    • 好的,我实现了这个,并尝试简单地将 KeyCode 打印到控制台以测试它是否有效,但它没有。 System.out.println("代码:" evt.getKeyCode());是否存在焦点问题,如果是,我该如何解决?
    • 我不完全确定,尽管您刚刚编写的代码缺少一个“+”号。
    • 好的,我正在取得进展。当我运行我的应用程序时,我注意到我的 7 键有一个蓝色边框,我认为这意味着它是专注的——确实如此。但是,如果这是唯一具有焦点的按钮,那就是唯一能够检测到 keyPressed 的按钮,如果我按下另一个键,焦点就会转移。所以把焦点放在容器上会很好,对吧?如果是这样,我该怎么做?
    • 就像我在上面的回答中提到的,这可能不是最好的解决方案。当我用 Java 制作应用程序时,我曾经做的是向容器以及所有按钮添加按键侦听器,这样,无论关注什么,应用程序都会检测到按键。
    • 问题已解决。非常感谢——这对 TONS 有帮助。我已经研究了一整天了。标记为答案。
    猜你喜欢
    • 2018-02-23
    • 2018-04-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多