Java计算器不止一次计算

Java计算器不止一次计算,java,Java,我已经为一个计算器编写了一个代码,但它还不能100%可靠地工作。每次我做一个计算,例如:“1+1=2”,我想做另一个计算,我必须关闭小程序并重新启动它。我怎样才能让它回到起点 代码如下: package beispiele; import java.awt.*; import java.awt.event.*; import java.applet.*; public class Kalkulator extends Applet { String arg1= "", arg2="";

我已经为一个计算器编写了一个代码,但它还不能100%可靠地工作。每次我做一个计算,例如:“1+1=2”,我想做另一个计算,我必须关闭小程序并重新启动它。我怎样才能让它回到起点

代码如下:

package beispiele;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Kalkulator extends Applet {
    String arg1= "", arg2="";
    int ergebnis;
    Button zahl[] =new Button[10];
    Button funktion[] = new Button[4];
    Button ausfuehren;
    Panel zahlPanel,funktionPanel,ergebnisPanel;
    TextField ergebnisFeld;
    int operationArgument;
    char operation;
    public void init () {
    operationArgument= 1; operation =' ';
    setLayout(new BorderLayout());
    zahlPanel = new Panel();
    zahlPanel.setLayout(new GridLayout (4,3));
    for (int i=9; i>=0; i--) {
        zahl[i] = new Button(String.valueOf(i));
        zahl[i].addActionListener(new ButtonZahlen());
        zahlPanel.add(zahl[i]);
    }
    zahlPanel.add(new Button("."));   //leere Taste
    ausfuehren = new Button("=");
    ausfuehren.addActionListener(new ButtonAusfuehren()); //zu dem Listener
    zahlPanel.add(ausfuehren);
    add("Center",zahlPanel);
    funktionPanel = new Panel();
    funktionPanel.setLayout(new GridLayout(4,1));
    funktion[0] = new Button("+");
    funktion[0].addActionListener(new ButtonOperation());
    funktionPanel.add(funktion[0]);
    funktion[1] = new Button("-");
    funktion[1].addActionListener(new ButtonOperation());
    funktionPanel.add(funktion[1]);
    funktion[2] = new Button("*");
    funktion[2].addActionListener (new ButtonOperation());
    funktionPanel.add(funktion[2]);
    funktion[3] = new Button("/");
    funktion[3].addActionListener (new ButtonOperation());
    funktionPanel.add(funktion[3]);

    //funktionPanel.add(new Button("*"));
    //funktionPanel.add(new Button("/"));
    add("East",funktionPanel);
    ergebnisPanel = new Panel();
    ergebnisFeld = new TextField("0",5);
    ergebnisPanel.add(ergebnisFeld);
    add("North",ergebnisPanel);
}
class ButtonZahlen implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        switch (operationArgument)   {
        case 1 :  {
            arg1+=e.getActionCommand();
            ergebnisFeld.setText(arg1);
            break;
        }
        case 2 :   {
            arg2 +=e.getActionCommand();
            ergebnisFeld.setText(arg2);
            break;
        }
        default: { }

        }
        }
    }
class ButtonAusfuehren implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        if(operation =='+')
            if (arg1.equals("")) {
                ergebnis += new Integer(arg2);
            } else {
                ergebnis = new Integer(arg1) + new Integer(arg2);
            }

        else if(operation =='-') {
            if(arg1.equals("")) {
                ergebnis -= new Integer(arg2);
            } else {
                ergebnis = new Integer(arg1) - new Integer(arg2);
            }               
        }
        else if(operation =='*') {
            if(arg1.equals("")) {
                ergebnis *= new Integer(arg2);
            } else {
                ergebnis = new Integer(arg1) * new Integer(arg2);
            }
        }
        else if(operation =='/') {
            if(arg1.equals("")) {
                ergebnis *= new Integer(arg2);
            } else {
                ergebnis = new Integer(arg1) / new Integer(arg2);
            }
        }
    }
}
class ButtonOperation implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("+")) {
            operation = '+'; operationArgument = 2;
            }
        else if(e.getActionCommand().equals("-")) {
                operation = '-'; operationArgument = 2;
                }
        else if(e.getActionCommand().equals("*")) {
                    operation = '*' ; operationArgument =2;
                    }
        else if(e.getActionCommand().equals("/")) {
                        operation = '/' ; operationArgument =2;
                    }

            }
        }
public void paint(Graphics g){   }


}

您在这里遇到了问题,因为您不小心使用if和else语句以及程序的逻辑。首先,在按钮操作的
actionPerformed
方法中,在
if(e.getActionCommand().equals(“-”)中有一个
if(e.getActionCommand().equals(“+”)
)。那没有道理,是吗?您使用这些ifs测试的命令是互斥的,因此您需要一个用于-操作的
else if
。然后在
按钮nausfuehren
actionPerformed()
方法中:再次考虑您想要做什么。您不需要最后一个字段-您可以始终将结果字段(
ergebnisFeld
)设置为结果。此外,当第二次执行操作时,操作本身不会工作,其中一个参数(
arg1
arg2
)将是空字符串。如果你考虑到这一点,你会得到这样的结果,再加上其他的改变,你的计算器可以工作了:

        if (operation == '+')
            if (arg1.equals("")) {
                ergebnis += new Integer(arg2);
            } else {
                ergebnis = new Integer(arg1) + new Integer(arg2);
            }

        else if (operation == '-') {
            if (arg1.equals("")) {
                ergebnis -= new Integer(arg2);
            } else {
                ergebnis = new Integer(arg1) - new Integer(arg2);
            }
        }

实际上,计算器上通常有一个C按钮,用于清除所有以前的计算并重新启动所有计算1)为什么要编写小程序?如果是由于老师的特殊要求,请参考。2) 为什么是AWT而不是Swing?关于放弃使用AWT组件的许多好理由,请参见我的答案。如果您需要支持较旧的基于AWT的API,请参阅。我见过这样的按钮,但我不知道如何操作。这就是寻求帮助的原因。我正在使用applet和awt,因为这是老师想要的。这是一个问题,因为很难找到关于它的详细信息。马丁,感谢你提供了非常快速和详细的答案。它确实帮助消除了一些误解,但仍然是“=”按钮不工作。我在这里编辑了我的代码,在ButtonSfuehren和ButtonOperation中做了新的更改