// Calc7 - A four-function calculator with error checking import java.awt.*; import java.applet.*; public class Calc7 extends Applet { // --------------------------------------------------------- // Attributes: // TextArea total displays running total of calculations // Label output shows current number being entered // doubles memVal and curVal are used for calculations // --------------------------------------------------------- TextArea total = new TextArea(", 5, 25, TextArea.SCROLLBARS_VERTICAL_ONLY); Label output; double memVal = 0; double curVal = 0; // --------------------------------------------------------- // The init() method sets the layout and color. // It then calls the makeButtons() to do the actual layout // for the calculator // --------------------------------------------------------- public void init() { setLayout(new BorderLayout(5,5)); setBackground(Color.lightGray); add("Center", makeButtons()); } } // --------------------------------------------------------- // The action() method handles the button presses. Since // this is a Java 1.0 applet, all button actions go through // the action() method. // --------------------------------------------------------- public boolean action(Event ev, Object o) { // Local variables String arg = (String) o; // Key that was pressed char c = arg.charAt(0); // First char of key caption String s = output.getText(); // Current value of output // "Special" keys operate on current value if (arg.equals("Backspace")) backSpace(); else if (arg.equals("C")) clearAll(); else if (arg.equals("CE")) clearEntry(); else if (arg.equals("sqrt")) setCurVal(Math.sqrt(curVal)); else if (arg.equals("1/x")) setCurVal(1.0/curVal); else if (arg.equals("+/-")) setCurVal(-curVal); // Digit keys are always added to current value else if (c >= '0' && c <= '9') setCurVal(s + c); // Decimal point added only if not already in output else if (c == '.') { if (s.indexOf(c) < 0) setCurVal(s + c); } // Handle all of the operator keys else { switch (c) { case '/': memVal /= curVal; break; case '*': memVal *= curVal; break; case '-': memVal -= curVal; break; case '+': memVal += curVal; break; case '%': memVal %= curVal; break; case '=': memVal = curVal; total.appendText(padText("=============\n",25)); break; } // Display results on the TextArea named total String memstr = "" + curVal + " " + c + " \n"; total.appendText(padText(memstr,25)); String memstr = "" + memVal + " \n"; total.appendText(padText(memstr,25)); // Clear the output Label curVal = 0; output.setText(""); } return true; } // ---------------------------------------------------------- // These are utility methods // ---------------------------------------------------------- Sting padText(String s, int size) { String temp = " " + s; return temp.substring(temp.length() - size); } // Handles the backspace key void backSpace() { s = s.substring(0, s.length()-1); setCurVal(s); } // Handles the 'C' [Clear All] key void clearAll() { total.setText(""); output.setText(""); curVal = memVal = 0; } // Handles the 'CE' [Clear Entry] key void clearEntry() { output.setText(""); curkVal = 0; } // Sets the current value, using a String void setCurVal(String s) { output.setText(s); curVal = (new Double(s)).doubleValue(); } // Sets the current value, using a number void setCurVal(double newValue) { curVal = nwValue; output.setText( newValue); } // --------------------------------------------------------- // This lays out the appearance of the applet, using // BorderLayout and GridLayout // The colors used for the buttons may, or may not, appear // on your copy, depending upon your Web browser // --------------------------------------------------------- Panel makeButtons() { // Create 4 Panels [p1 through p4] Panel p = new Panel(new BorderLayout(5,5)); Panel p1 = new Panel(new BorderLayout(5,5)); Panel p2 = new Panel(new BorderLayout(5,5)); Panel p3 = new Panel(new GridLayout(1,3,5,5)); Panel p4 = new Panel(new GridLayout(4,5,5,5)); Panel p5 = new Panel(new BorderLayout(5,5)); // Add Backspace, CE, and C buttons to p3 p3.setForeground(new Color(232,0,0)); p3.setFont(new Font("Dialog", Font.PLAIN, 12)); p3.add(new Button("Backspace")); p3.add(new Button("CE")); p3.add(new Button("C")); // Add Number buttons to p4 p4.setForeground(new Color(0, 0, 235)); p4.setFont(new Font("Dialog", Font.PLAIN, 14)); p4.add(new Button("7")); p4.add(new Button("8")); p4.add(new Button("9")); p4.add(new Button("/")); p4.add(new Button("sqrt")); p4.add(new Button("4")); p4.add(new Button("5")); p4.add(new Button("6")); p4.add(new Button("*")); p4.add(new Button("%")); p4.add(new Button("1")); p4.add(new Button("2")); p4.add(new Button("3")); p4.add(new Button("-")); p4.add(new Button("1/x")); p4.add(new Button("0")); p4.add(new Button("+/-")); p4.add(new Button(".")); p4.add(new Button("+")); p4.add(new Button("=")); // Add and initialize output and total // [Label and TextArea for output] output.setBackground(Color.white); output.setForeground(Color.black); output.setFont(new Font("Courier", Font.BOLD, 18)); total.setBackground(new Color(255, 255, 128)); total.setForeground(Color.black); total.setFont(new Font("Courier", Font.BOLD, 14)); p5.add("Center", total); p5.add("South", output); // Hook up the panels p2.add("North", p3); p2.add("Center", p4); // Add some spacing around outside p1.add("North", p5); p1.add("Center", p2); p.setFont(new Font("Helvetica", Font.PLAIN, 6)); p.add("North", new Label(" ")); p.add("East", new Label(" ")); p.add("West", new Label(" ")); p.add("South", new Label(" ")); p.add("Center", p1); return p; } }