package lab7out; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Calculator extends JFrame { private Container cp; private String[] name = {"0", "1", "2", "+", "C", "3", "4", "5", "-", "(", "6", "7", "8", "*", ")", "9", "+/-", ".", "/", "="}; private JButton[] button; private JTextField text; private double value = 0; private int number = 0; private boolean flag = false; //Has an operator been pressed? private boolean flag2 = false; //Has a ( been pressed private boolean flag3 = false; //Clear ( statement or not public Calculator() { super("Calculator"); this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); cp = this.getContentPane(); button = new JButton[20]; Font font = new Font("Serif", Font.BOLD, 12); text = new JTextField(12); ButtonGroup bg = new ButtonGroup(); ActionHandler ah = new ActionHandler(); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(new GridLayout(4,5,5,5)); JPanel p3 = new JPanel(); text.setFont(font); text.setEditable(false); text.addActionListener(ah); p1.add(text); for(int i = 0; i < 20; i++) { button[i] = new JButton(name[i]); button[i].setFont(font); button[i].addActionListener(ah); bg.add(button[i]); p2.add(button[i]); } p3.add(p2); cp.add(p1,BorderLayout.NORTH); cp.add(p3,BorderLayout.CENTER); this.setSize(275,225); this.setVisible(true); } //Listening class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent ae) { //Get the object that Generated Object obj = ae.getSource(); //Get the action command associated with event String message = ae.getActionCommand(); //Convert Object to a JButton if (obj instanceof JButton) { //These if statements are messy, but all other ways I could think of resulted in the same thing being checked twice //Better to have longer code than longer running time if (message.charAt(0) == '=') { if(!flag2) { operation(number); text.setText(Double.toString(value)); number = 0; flag = true; } else { operation(text.getText()); text.setText(Double.toString(value)); number = 0; flag = true; flag2 = false; flag3 = true; } } else if ((message.charAt(0) == '+') && (message.length() == 1)) { if(!flag2) { operation(number); text.setText(Double.toString(value)); number = 1; flag = true; } else { String contents = text.getText(); text.setText(contents + "+"); } } else if (message.charAt(0) == '-') { if(!flag2) { operation(number); text.setText(Double.toString(value)); number = 2; flag = true; } else { String contents = text.getText(); text.setText(contents + "-"); } } else if (message.charAt(0) == '*') { if(!flag2) { operation(number); text.setText(Double.toString(value)); number = 3; flag = true; } else { String contents = text.getText(); text.setText(contents + "*"); } } else if (message.charAt(0) == '/') { if(!flag2) { operation(number); text.setText(Double.toString(value)); number = 4; flag = true; } else { String contents = text.getText(); text.setText(contents + "/"); } } else if(message.charAt(0) == 'C') { value = 0; number = 0; flag = false; flag2 = false; text.setText(null); } else if(message.charAt(0) == '.') { String contents = text.getText(); text.setText(contents + "."); } else if((message.charAt(0) == '+') && (message.charAt(1) == '/')) { operation(5); text.setText(Double.toString(value)); } else if(message.charAt(0) == '(') { flag2 = true; if(!flag3) { String contents = text.getText(); text.setText(contents + "("); } else { text.setText("("); flag3 = false; } } else { if (((flag) && (!flag2))) { text.setText(null); flag3 = false; } String contents = text.getText(); JButton jb = (JButton) obj; text.setText(contents + message); flag = false; } } } //0:Nothing, 1:Addition, 2:Subtraction, 3:Multiplication, 4:Division, 5:+/- public void operation(int number) { if(number == 0) { value = Double.parseDouble(text.getText()); } else if(number == 1) { value += Double.parseDouble(text.getText()); } else if(number == 2) { value -= Double.parseDouble(text.getText()); } else if(number == 3) { value *= Double.parseDouble(text.getText()); } else if(number == 4) { value /= Double.parseDouble(text.getText()); } else if(number == 5) { value = -value; } } //Takes two numbers and an operation to perform on them public void operation(double num1, double num2, String operation) { if(operation.charAt(0) == '+') { value = (num1 + num2); } else if(operation.charAt(0) == '-') { value = (num1 - num2); } else if(operation.charAt(0) == '*') { value = (num1 * num2); } else if(operation.charAt(0) == '/') { value = (num1 / num2); } } public void operation(String equ) { StringBuffer message = new StringBuffer(equ); int start = 0; int operand = 0; int last = 0; double num1 = 0.0; double num2 = 0.0; for(int i = 0; i < message.length(); i++) { if(message.charAt(i) == '(') { start = i; } else if((message.charAt(i) == '+') || (message.charAt(i) == '-') || (message.charAt(i) == '*') || (message.charAt(i) == '/')) { operand = i; } else if(message.charAt(i) == ')') { last = i; //Get first number String temp1 = new String(message.substring((start + 1),operand)); num1 = Double.parseDouble(temp1); //Get second number String temp2 = new String(message.substring((operand + 1),last)); num2 = Double.parseDouble(temp2); //Get operator String operation = new String(message.substring(operand,(operand + 1))); operation(num1,num2,operation); //Make new string String new_string = new String(message.substring(0,start)); String new_string2 = new String(message.substring(last + 1)); message.delete(0,message.length()); message.insert(0,new_string); message.append(value); message.append(new_string2); //Reset values i = 0; start = 0; operand = 0; last = 0; } } } } //Returns the JTextField public JTextField getJTextField() { return(text); } //Returns the JButton with the corresponding name public JButton getButton(String label) { int i = 0; for(i = 0; i < 20; i++) { String message = button[i].getActionCommand(); if(label.charAt(0) == message.charAt(0)) { break; } } return(button[i]); } public static void main(String[] args) { Calculator calculator = new Calculator(); } }