2014-01-10 151 views
0

我已經爲計算器編寫了一個代碼,但它不能100%可靠地工作。每次我做一個計算,例如:「1 + 1 = 2」,我想做另一次計算,我必須關閉小程序並重新開始。我怎樣才能讓它在開始時回到原點。Java計算器不止一次計算

下面是代碼:

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){ } 


} 
+1

實際上,通常在計算器一個C鍵,即清除所有以前的計算和重新啓動全部 – petajamaja

+2

1)爲什麼要編寫一個小程序?如果這是由於規格。由老師,請參考[爲什麼CS老師應該停止教Java applets](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/)。 2)爲什麼選擇AWT而不是Swing?看到我對[Swing extras over AWT]的回答(http://stackoverflow.com/a/6255978/418556)有很多很好的理由放棄使用AWT組件。如果您需要支持較老的基於AWT的API,請參閱[混合重量級和輕量級組件](http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html)。 –

+0

我看到過這樣的按鈕,但我不知道該怎麼做。這就是尋求幫助的原因。 我正在使用applet和awt,因爲那是老師想要的。這是一個問題,因爲很難找到關於它的詳細信息。 –

回答

1

您在這裏有問題,因爲你不小心,你如果和else語句和程序的邏輯。首先,在ButtonOperationactionPerformed方法中,您有一個if(e.getActionCommand().equals("-"))裏面if(e.getActionCommand().equals("+"))。這沒有意義,是嗎?您正在測試的命令與這些ifs是相互排斥的,因此 - 操作的else if是您想要的。然後在ButtonAusfuehrenactionPerformed()方法:再次,想想你想做什麼。您不需要最後的其他人 - 您可以始終將結果字段(ergebnisFeld)設置爲結果。另外,操作本身不會像第二次操作完成時一樣,其中一個參數(arg1arg2)應該是空字符串。如果你考慮到這一點,你會得到這樣的事情,這與其他的變化,讓您的計算器工作:

 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); 
      } 
     } 
+0

馬丁,感謝你真正快速和詳細的答案。它真的幫助清除一些missunderstandings,但仍然「=」按鈕不起作用。我在這裏編輯我的代碼與ButtonAusfuehren和ButtonOperation中的新變化 –