Java中使用KeyListener编写计算器

3

我是一个编程初学者,请耐心等待,我正在尝试使用KeyListener制作计算器,以下是我得到的代码(已剪切)

    public void keyPressed(KeyEvent e){
    int code = e.getKeyCode();
    System.out.println("   Code: " + KeyEvent.getKeyText(code));

    if(KeyEvent.VK_ADD == e.getKeyCode()){
        tmp = Double.parseDouble(txtDisplay.getText());
        txtDisplay.setText(display);
        add = true;

    }
    if(KeyEvent.VK_DIVIDE == e.getKeyCode()){
        tmp = Double.parseDouble(txtDisplay.getText());
        txtDisplay.setText(display);
        div = true;
    }
    if(KeyEvent.VK_SUBTRACT == e.getKeyCode()){
        tmp = Double.parseDouble(txtDisplay.getText());
        txtDisplay.setText(display);
        sub = true;
    }
    if(KeyEvent.VK_MULTIPLY == e.getKeyCode()){
        tmp = Double.parseDouble(txtDisplay.getText());
        txtDisplay.setText(display);
        mul = true;
    }
    if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE){
        txtDisplay.setText("");
        tmp = 0;
        toSolve = 0;
    }
    if(e.getKeyCode() == KeyEvent.VK_ENTER){
        toSolve = Double.parseDouble(txtDisplay.getText());
        if( add == true ){
            toSolve = tmp + toSolve;}

        else if ( sub == true  ){

            toSolve = tmp - toSolve;}

        else if ( mul == true  ){

            toSolve = tmp * toSolve;}

        else if ( div == true  ){

            toSolve = tmp / toSolve;}

    txtDisplay.setText(Double.toString( toSolve ));

    add = false ;
    sub = false ;
    mul = false ;
    div = false ;

    }


}

我希望它执行所有操作,但当我运行它时,似乎只做了加法。我认为这可能是我的编程逻辑问题。另外,如何从文本字段中删除操作符号,因为它也会转换符号,导致抛出异常。


可能您使用了错误的按键常量。尝试使用VK_SLASH代替VK_DIVIDE,并使用VK_MINUS代替VK_SUBTRACT - Sergiy Medvynskyy
没有成功,没有起作用。 - Pon
  1. 为了更快地获得更好的帮助,请发布一个[MCVE]或简短,自包含,正确的示例
  2. 参见此计算器示例。它使用ScriptEngine来评估文本字段中的表达式。
- Andrew Thompson
1个回答

1
尝试使用 keyReleased() 而不是 keyPressed():
public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
        //Do something
}

在Java中,有些监听器存在一些bug,如果你不去质疑它背后的原因,有时会节省很多麻烦。


好的,现在我很好奇,因为那种方法通常对我有效。不过你把监听器添加到框架上了,是吗? - Alexander Heim
我已经添加了它。 - Pon
我认为我的问题出在尝试将其转换为double时,因为数字前面还有一个符号(例如/3),所以当我将其转换为double时会导致异常,但是当它像这样(例如-3)时就不会发生异常,只是将其相加。 - Pon
那么你能进入这个方法吗?好的,那么在if语句中加入一些输出,你就会知道自己是否真的能够进入其中一个。当你能够做到这一点时,我会将设置为false的子句注释掉。可能你总是会进入那个子句,所以你当然会始终得到false。 - Alexander Heim
嘿,我在所有的if子句中添加了一个输出,它们都能正常工作,但它仍然只是加法。 - Pon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接