2013-06-02 104 views
-1

我已经在NetBeans中编写了一个计算器,它的功能完美无缺。但是,我必须实际点击按钮才能插入数字,并试图用KeyListener进行补救。我将所有数字和功能按钮设置在JPanel命名按钮中。我在一个名为display的JPanel中有我的显示标签。在NetBeans中为计算器使用KeyListener

我将我的类设置为实现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行代码),而且我可以不编辑任何它。让我知道我是否可以提供更多有用的信息。

+0

你可以发布你的代码吗? –

+0

你有没有完成任何教程?这里有一个:http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html –

+0

我张贴了一些代码。我已经关注了4个不同的教程,其中包括您列出的教程。我似乎无法弄清楚。他们正在JComponent上创建一个新的KeyListener,但我似乎无法做到这一点。 – Nick

回答

1

我不知道我完全理解你的问题,有些代码会有所帮助,但我会采取一些措施,因为这听起来像是我过去常常遇到的问题。

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

enter image description here

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

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

+0

好吧,我实现了这一点,并试图简单地将KeyCode打印到控制台,以测试它是否有效,但它没有。 System.out.println(“Code:”evt.getKeyCode()); 会不会有焦点问题,如果有的话,我该如何解决这个问题? – Nick

+0

我不完全确定,尽管刚刚写的代码缺少'+'符号。 – Move127

+0

好的,我正在取得进展。当我运行我的应用程序时,我注意到我的7键有一个蓝色的边框,我认为这意味着它的焦点 - 确实如此。但是,如果这是唯一具有焦点的按钮,那么这是唯一能够检测到keyPressed的按钮,并且如果我按另一个按钮,则焦点会转移。所以将重点放在容器上是对的,对吗?如果是这样,我该怎么做? – Nick

4

难道有焦点问题吗?如果有的话,我该如何解决这个问题?

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

Swing设计用于键绑定。那就是你创建一个可以做你想要的动作。然后这个动作可以被添加到你的JButton。它也可以绑定到KeyStroke。所以你有很好的可重用代码。

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

+1

马+水:P – MadProgrammer