##
__Simple Calculator in JAVA__

This is a simple java calculator project to calculate basic arithmetic operations using GUI features of Java extending JFrame Class. The source code is organized in two files. They are:

1. Main.java and

2. Calc_Frame.java

Before actually digging deeper into the source code, lets first see the the output of the project tested with an input expression 9/2*3 whose obvious output after calculation is 13.5

Here are the snapshots:

Figure: Input of test expression 9/2*3

Figure: Result of test input expression.

##
__1. Main.java__

**//Contents of the file "Main.java"**
/**

* Created by Bikal Adhikari on 12/18/2014.

*/

public class Main {

public static void main(String[] args) {

Calc_Frame m=new Calc_Frame("BKL-Calculator");

}

}

##
__2. Calc_Frame.java__

**//Contents of the file "Calc_Frame.java"**
/**

* Created by Bikal Adhikari on 12/18/2014.

*/

import java.awt.Container;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class Calc_Frame extends JFrame {

JPanel p1 = new JPanel();

JPanel p2 = new JPanel();

/*Text Field For emulating Calculator Screen*/

JTextArea CalcScreen = new JTextArea();

/*Defining Buttons For keys of Calculator*/

JButton b0 = new JButton("7");

JButton b1 = new JButton("8");

JButton b2 = new JButton("9");

JButton b3 = new JButton("/");

JButton b4 = new JButton("4");

JButton b5 = new JButton("5");

JButton b6 = new JButton("6");

JButton b7 = new JButton("*");

JButton b8 = new JButton("1");

JButton b9 = new JButton("2");

JButton b10 = new JButton("3");

JButton b11 = new JButton("-");

JButton b12 = new JButton("0");

JButton b13 = new JButton(".");

JButton b14 = new JButton("=");

JButton b15 = new JButton("+");

public Calc_Frame(String str) {

super(str);

Container c = getContentPane();

p1.setLayout(new GridLayout(1, 1, 10, 450));

p2.setLayout(new GridLayout(4, 4));

p1.add(CalcScreen);

CalcScreen.setEditable(false);

/*Adding Buttons to panel p2*/

p2.add(b0);

p2.add(b1);

p2.add(b2);

p2.add(b3);

p2.add(b4);

p2.add(b5);

p2.add(b6);

p2.add(b7);

p2.add(b8);

p2.add(b9);

p2.add(b8);

p2.add(b9);

p2.add(b10);

p2.add(b11);

p2.add(b12);

p2.add(b13);

p2.add(b14);

p2.add(b15);

/*Adding panels to container */

c.add(p1);

c.add(p2, BorderLayout.SOUTH);

/*Setting Size of the Frame*/

setSize(250, 200);

setVisible(true);

/*Handler for Button Event Handling*/

Handler h = new Handler();

/*Registering Handler into Action Listener*/

b0.addActionListener(h);

b1.addActionListener(h);

b2.addActionListener(h);

b3.addActionListener(h);

b4.addActionListener(h);

b5.addActionListener(h);

b6.addActionListener(h);

b7.addActionListener(h);

b8.addActionListener(h);

b9.addActionListener(h);

b10.addActionListener(h);

b11.addActionListener(h);

b12.addActionListener(h);

b13.addActionListener(h);

b14.addActionListener(h);

b15.addActionListener(h);

}

/*Class to handle event generated by the button press*/

class Handler implements ActionListener {

int pos=0;

public void actionPerformed(ActionEvent e) {

if (e.getSource() == b0) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("7",pos);

}

if (e.getSource() == b1) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("8",pos);

}

if (e.getSource() == b2) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("9",pos);

}

if (e.getSource() == b3) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("/",pos);

}

if (e.getSource() == b4) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("4",pos);

}

if (e.getSource() == b5) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("5",pos);

}

if (e.getSource() == b6) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("6",pos);

}

if (e.getSource() == b7) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("*",pos);

}

if (e.getSource() == b8) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("1",pos);

}

if (e.getSource() == b9) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("2",pos);

}

if (e.getSource() == b10) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("3",pos);

}

if (e.getSource() == b11) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("-",pos);

}

if (e.getSource() == b12) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("0",pos);

}

if (e.getSource() == b13) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert(".",pos);

}

//Equals to Button

if (e.getSource() == b14) {

String str=CalcScreen.getText();

double a=eval(str);

CalcScreen.setText(null);

String abc = Double.toString(a);

CalcScreen.insert(abc,0);

}

if (e.getSource() == b15) {

pos = CalcScreen.getCaretPosition(); //get the cursor position

CalcScreen.insert("+",pos);

}

}

}//Class Handler Ends Here

/**

* This Function performs job of parsing arithmetic expressions given to the calculator

* It basically supports parsing expression containing Division, Multiplication, Addition and Subtraction

* */

public static double eval(final String str) {

class Parser {//Nested Class

int pos = -1, c;

void eatChar() {

c = (++pos < str.length()) ? str.charAt(pos) : -1;

}

void eatSpace() {

while (Character.isWhitespace(c)) eatChar();

}

double parse() {

eatChar();

double v = parseExpression();

if (c != -1) throw new RuntimeException("Unexpected: " + (char)c);

return v;

}

// Grammar:

// expression = term | expression `+` term | expression `-` term

// term = factor | term `*` factor | term `/` factor | term brackets

// factor = brackets | number | factor `^` factor

// brackets = `(` expression `)`

double parseExpression() {

double v = parseTerm();

for (;;) {

eatSpace();

if (c == '+') { // addition

eatChar();

v += parseTerm();

} else if (c == '-') { // subtraction

eatChar();

v -= parseTerm();

} else {

return v;

}

}

}

double parseTerm() {

double v = parseFactor();

for (;;) {

eatSpace();

if (c == '/') { // division

eatChar();

v /= parseFactor();

} else if (c == '*' || c == '(') { // multiplication

if (c == '*') eatChar();

v *= parseFactor();

} else {

return v;

}

}

}

double parseFactor() {

double v;

boolean negate = false;

eatSpace();

if (c == '(') { // brackets

eatChar();

v = parseExpression();

if (c == ')') eatChar();

} else { // numbers

if (c == '+' || c == '-') { // unary plus & minus

negate = c == '-';

eatChar();

eatSpace();

}

StringBuilder sb = new StringBuilder();

while ((c >= '0' && c <= '9') || c == '.') {

sb.append((char)c);

eatChar();

}

if (sb.length() == 0) throw new RuntimeException("Unexpected: " + (char)c);

v = Double.parseDouble(sb.toString());

}

eatSpace();

if (c == '^') { // exponentiation

eatChar();

v = Math.pow(v, parseFactor());

}

if (negate) v = -v; // exponentiation has higher priority than unary minus: -3^2=-9

return v;

}

}

return new Parser().parse();

}

}//Class Calc_Frame ends here

All the necessary project files are included in this zipped archive. To download

click here.

##
**"Enjoy Learning"**