import java.awt.*; import java.awt.event.*; import javax.swing.*; class CalculatorPanel extends JPanel implements ActionListener { public CalculatorPanel() { setLayout(new BorderLayout()); JPanel d = new JPanel(); CalcPad = new PadDisplay(10, 28); JScrollPane scrollPane = new JScrollPane(CalcPad); d.add(scrollPane); add(d,"South"); display = new CalcField("Press CM to turn on the calculator"); display.setEditable(false); display.setBackground(Color.white); add(display, "North"); JPanel p = new JPanel(); p.setLayout(new GridLayout(5, 5)); addButton(p, "CM"); String buttons = "CRS=789/^456*(123-)0."; for (int i = 0; i < buttons.length(); i++) addButton(p, buttons.substring(i, i + 1)); addButton(p, "+/-"); addButton(p, "+"); addButton(p, "sqrt"); add(p, "Center"); } private void addButton(Container c, String s) { JButton b = new JButton(s); c.add(b); if(s.equals("R") || s.equals("S")) b.addActionListener(MButtonListener); else { if('0' <= s.charAt(0) && s.charAt(0) <= '9' || s.equals(".")) b.addActionListener(DButtonListener); else b.addActionListener(this); } } private double Arg1 = 0.0; private double Arg2 = 0.0; private String op = null; private boolean firstInput = true; private double[] buffer = new double[10]; private double TempBuffer = 0.0; private int saveIndex = 0; private int recallIndex = 0; private boolean unSaved = true; private boolean unRecalled = true; private boolean parenthesis=false; private String TempOp = null; private CalcField display; private PadDisplay CalcPad; MemoryButtonListener MButtonListener = new MemoryButtonListener(); DigitButtonListener DButtonListener= new DigitButtonListener(); public void actionPerformed( ActionEvent e ) { String in = e.getActionCommand(); if(in.equals("C")) { CalcPad.appendTextToPad("Clear"); display.setText("0.0"); clearOp(); Arg1=0.0; } else if(in.equals("CM")) { CalcPad.appendTextToPad("Clear Memory"); clearMe(); } else if(in.equals("(")){ TempBuffer=Arg1; TempOp = op; CalcPad.append(in); parenthesis=true; } else if(in.equals(")")){ Arg2=display.getNumber(); CalcPad.appendTextToPad(display.getText()); CalcPad.append(in); compute(); CalcPad.appendLineToPad(); display.setNumber(Arg1); CalcPad.appendNumberToPad(Arg1); Arg1=TempBuffer; op=TempOp; parenthesis=false; clearOp(); } else if(in.equals("=")) { Arg2 = display.getNumber(); CalcPad.appendTextToPad(display.getText()); CalcPad.appendLineToPad(); compute(); display.setNumber(Arg1); CalcPad.appendNumberToPad(Arg1); clearOp(); } else if(in.equals("+/-")) { double x = display.getNumber(); x = (-1)*x; display.setNumber(x); CalcPad.appendTextToPad(display.getText()); CalcPad.appendLineToPad(); } else { Arg1 = display.getNumber(); CalcPad.appendTextToPad(display.getText()); op=in; switch(in.charAt(0)) { case 's': CalcPad.appendOpToPad(in); CalcPad.appendNumberToPad(Arg1); compute(); display.setNumber(Arg1); CalcPad.appendLineToPad(); CalcPad.appendNumberToPad(Arg1); break; default: CalcPad.appendOpToPad(op); break; } firstInput = true; } } public void compute() { switch(op.charAt(0)) { case '+': Arg1 +=Arg2; break; case '-': Arg1 -=Arg2; break; case '*': Arg1 *=Arg2; break; case '/': Arg1 /=Arg2; break; case '^': Arg1 = Math.pow(Arg1, Arg2); break; case 's': if(Arg1 < 0) display.setText("Error, Press C"); else Arg1 = Math.sqrt(Arg1); break; default: display.setText("Wrong Op, Press C"); break; } } public void clearOp() { Arg2 = 0.0; firstInput = true; TempBuffer=0.0; TempOp = null; } public void clearMe() { Arg1 = 0.0; Arg2 = 0.0; firstInput = true; TempBuffer = 0.0; TempOp = null; for(int i=0; i<10; i++) buffer[i]=0.0; saveIndex = 0; recallIndex = 0; unSaved = true; unRecalled = true; display.setText("0.0"); } //---------------------------------------------------------- //INNER CLASS: MemoryButtonListener public class MemoryButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { String s = e.getActionCommand(); if (s.equals("S")) { TempBuffer=display.getNumber(); unSaved = false; display.setText(""); CalcPad.appendOpToPad("save at: buffer"); } else if(s.equals("R")) { unRecalled = false; display.setText(""); CalcPad.appendOpToPad("recall buffer"); } } }; //----------------------------------------------------------- //INNER CLASS: DigitButtonListenner public class DigitButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { if(unSaved && unRecalled){ display.AddString(e.getActionCommand()); } else { String s = e.getActionCommand(); if(s.equals(".")) { display.setText("Error input, press C"); CalcPad.appendTextToPad("Wrong buffer index number"); } else { if(unSaved == false) { saveIndex=Integer.valueOf(s).intValue(); buffer[saveIndex]=TempBuffer; TempBuffer = 0.0; CalcPad.append(String.valueOf(saveIndex).toString()); CalcPad.append("\n"); unSaved = true; } else if(unRecalled == false) { recallIndex = Integer.valueOf(s).intValue(); display.setNumber(buffer[recallIndex]); CalcPad.append(String.valueOf(recallIndex).toString()); CalcPad.append("\n"); unRecalled = true; } } } } }; //----------------------------------------------------------- //INNER CLASS: CalcField, extends TextField private class CalcField extends TextField { CalcField(String x) { super(x); } public void AddString(String x) { if((unSaved==true) && (unRecalled==true)){ if (firstInput) { this.setText(x); firstInput = false; } else this.setText(display.getText() + x); } else{} } private void setNumber(double x) { this.setText(String.valueOf(x).toString()); } private void setNumber(int x) { this.setText(String.valueOf(x).toString()); } private double getNumber() { return Double.valueOf(this.getText()).doubleValue(); } }; //-------------------------------------------------------------- //INNER class PadDisplay extents JTextArea private class PadDisplay extends JTextArea { PadDisplay(int cn, int an) { super(cn, an); } private void appendTextToPad(String s) { this.append("\t" + s + "\n"); } private void appendLineToPad() { this.append("____________________\n"); } private void appendNumberToPad(double x) { this.append("\t"+String.valueOf(x).toString()+"\n\n"); } private void appendOpToPad(String s) { this.append(" "+s); } }; //--------------------------------------------------------------- } /*class CalculatorFrame extends JFrame { public CalculatorFrame() { setTitle("Calculator World"); setSize(320, 380); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); CalculatorPanel CalcPane = new CalculatorPanel(); Container contentPane = getContentPane(); contentPane.add(CalcPane, "North"); } }*/ public class CalculatorApplet extends JApplet { public void init() { Container contentPane = getContentPane(); contentPane.add(new CalculatorPanel()); } }