//Calculator.java //needs WindowDestroyer.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.lang.Math; /*********************** * Square Root: for some reason the unicode \u221A * displays a lowercase v in the button no matter * how big, so I have used "sqrt" instead * This is the same for Pi * * * MS, MR, and MC buttons are used * * +/- toggle button is used * * * *************************/ public class Calculator { public static void main(String[] args) { new CalculatorFrame().show(); } }//end Calculator class CalculatorFrame extends JFrame { public CalculatorFrame() { setTitle("Calculator"); setLocation(100, 100); setSize(300, 300); addWindowListener(new WindowDestroyer()); JTextField display = new JTextField("0.0"); display.setHorizontalAlignment(JTextField.RIGHT); display.setBackground(Color.white); display.setEditable(false); getContentPane().add(display, "North"); getContentPane().add(new CalculatorPanel(display), "Center"); } }//end CalculatorFrame class CalculatorPanel extends JPanel { public CalculatorPanel(JTextField display) { this.display = display; setLayout(new GridLayout(5, 5)); JButton MC = new JButton("MC"); add(MC); MC.addActionListener(listener); JButton MR = new JButton("MR"); add(MR); MR.addActionListener(listener); JButton MS = new JButton("MS"); add(MS); MS.addActionListener(listener); JButton sqR = new JButton("sqrt"); add(sqR); sqR.addActionListener(listener); JButton C = new JButton("C"); add(C); C.addActionListener(listener); JButton Pi = new JButton("Pi"); add(Pi); Pi.addActionListener(listener); String buttons = "789/"; for (int i = 0; i < buttons.length(); ++i) { JButton b = new JButton(buttons.substring(i, i + 1)); add(b); b.addActionListener(listener); } JButton plsMin = new JButton("+/-"); add(plsMin); plsMin.addActionListener(listener); buttons = "456*"; for (int i = 0; i < buttons.length(); ++i) { JButton b = new JButton(buttons.substring(i, i + 1)); add(b); b.addActionListener(listener); } JButton Bk = new JButton("Bk"); add(Bk); Bk.addActionListener(listener); buttons = "123-"; for (int i = 0; i < buttons.length(); ++i) { JButton b = new JButton(buttons.substring(i, i + 1)); add(b); b.addActionListener(listener); } JButton none = new JButton("Exit"); add(none); none.addActionListener(listener); buttons = "0.+="; for (int i = 0; i < buttons.length(); ++i) { JButton b = new JButton(buttons.substring(i, i + 1)); add(b); b.addActionListener(listener); } }//end CalculatorPanel /************************* * * End Display * ************* * * Start Operations * ***************************/ private JTextField display; private ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); if(command.equals("Bk")){ background = true; }//end bk if(command.equals("Exit")){ System.exit(0); }//end exit if(command.equals("C")){ reset(); display.setText("0.0"); }//end clear if(command.equals("Pi")){ display.setText("3.14"); reg = 3.14; register = true; }//end Pi if(command.charAt(0) >= '0' && command.charAt(0) <= '9'){ if(!start){ display.setText(display.getText() + command); }else{ display.setText(""+command); start = false; numbers = true; } }//end numbers if(command.equals(".")){ if(!decimal){ if(!start){ display.setText(display.getText() + command); decimal = true; }else{ display.setText("0"+command); decimal = true; start = false; numbers = true; } } }//end decimal if(command.equals("+")||command.equals("-")|| command.equals("*")||command.equals("/")|| command.equals("=")){ if(operator&&numbers){ start = true; decimal = false; numbers = false; calculate(); op = command; operator = true; display.setText(""+reg); }else{ op = command; operator = true; start = true; decimal = false; reg = Double.parseDouble(display.getText()); } }//end operations if(command.equals("sqrt")){ if(0>Double.parseDouble(display.getText())){ display.setText("ERROR"); }else{ display.setText(""+Math.sqrt(Double.parseDouble(display.getText()))); } }//end square root if(command.equals("+/-")){ if(0Double.parseDouble(display.getText())){ display.setText(""+(Double.parseDouble(display.getText())*-1.0)); } }//end plus minus toggle /**************************************** *Memory Functions * MS puts input field into memory * MR puts memory into input field * MC sets memory to 0.0 * ****************************************/ if(command.equals("MS")){ memory = Double.parseDouble(display.getText()); } if(command.equals("MC")){ memory = 0.0; } if(command.equals("MR")){ display.setText(""+memory); } printSettings(); }//end actionPerformed //To seperate the "operations" from the "calculations" private void calculate(){ if(op.equals("+")){ reg = reg + Double.parseDouble(display.getText()); }else if(op.equals("-")){ reg = reg - Double.parseDouble(display.getText()); }else if(op.equals("*")){ reg = reg * Double.parseDouble(display.getText()); }else if(op.equals("/")){ reg = reg / Double.parseDouble(display.getText()); }else if(op.equals("=")){ reg = Double.parseDouble(display.getText()); } } //reset the flags and registers private void reset(){ decimal = false; operator = false; register = false; start = true; numbers = false; op = "="; reg = 0.0; } //show the status on demand private void printSettings(){ if(background){ System.out.println("settings: "); System.out.println(" decimal: "+decimal); System.out.println(" operator: "+operator); System.out.println(" register: "+register); System.out.println(" start: "+start); System.out.println(" numbers: "+numbers); System.out.println(" op: "+op); System.out.println(" reg: "+reg); System.out.println(" memory: "+ memory); } }//end print settings //default settings //flags private boolean decimal = false; //is a decimal point entered private boolean operator = false; //is the operator entered private boolean register = true; //is there a previous value private boolean start = true; //is this the beginging of entry private boolean numbers = false; //are there numbers in the input private boolean background = false; //turn on command line output //stuff private String op = "="; //set default op to equals private double reg = 0.0; //register for previouly entered or calculated values private double memory = 0.0; //number memory };//end ActionListener }//end CalculatorPanel