Java Swing Calculator

This is a free Java calculator tutorial developed using Java Swing. Below you will find the java code for calculator along with the screenshot. It is a basic four-function calculator java program source code. The calculator that we build will look like:

Java simple calculator

1. A four-function calculator with the following functions:
* Addition – adds two numbers: n1 + n2.
* Subtraction – subtracts number two from number one: n1 – n2.
* Multiplication – Multiplies two numbers: n1 * n2.
* Division – divides number two into number one: n1 / n2.

2. Used JButton for the numbers and functions.

3. Used Jmenu for File and help.
4. Created a class to respond to the events caused by numbers, functions, exit, help and about functionality.

5. Used BorderLayout to layout various components in the Calculator Frame. A BorderLayout lays out a container, arranging
and resizing its components to fit in five regions: north, south, east, west, and center.

JAVA CALCULATOR SOURCE CODE

Oct 15, 2006 by Hemanth

/*
 Name: Hemanth. B
 Website: wwww.java-swing-tutorial.html
 Topic: A basic Java Swing Calculator
 Conventions Used in Source code

 ---------------------------------

 1. All JLabel components start with jlb*

 2. All JPanel components start with jpl*

 3. All JMenu components start with jmenu*

 4. All JMenuItem components start with jmenuItem*

 5. All JDialog components start with jdlg*

 6. All JButton components start with jbn*

 */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;

public class Calculator extends JFrame implements ActionListener {

	// Variables
	final int MAX_INPUT_LENGTH = 20;
	final int INPUT_MODE = 0;
	final int RESULT_MODE = 1;
	final int ERROR_MODE = 2;
	int displayMode;
	boolean clearOnNextDigit, percent;
	double lastNumber;
	String lastOperator;
	private JMenu jmenuFile, jmenuHelp;
	private JMenuItem jmenuitemExit, jmenuitemAbout;
	private JLabel jlbOutput;
	private JButton jbnButtons[];
	private JPanel jplMaster, jplBackSpace, jplControl;
	/*

	 * Font(String name, int style, int size)

	 Creates a new Font from the specified name, style and point size.

	 */
	Font f12 = new Font("Times New Roman", 0, 12);
	Font f121 = new Font("Times New Roman", 1, 12);
	// Constructor
	public Calculator() {
		/* Set Up the JMenuBar.

		 * Have Provided All JMenu's with Mnemonics

		 * Have Provided some JMenuItem components with Keyboard Accelerators

		 */
		jmenuFile = new JMenu("File");
		jmenuFile.setFont(f121);
		jmenuFile.setMnemonic(KeyEvent.VK_F);
		jmenuitemExit = new JMenuItem("Exit");
		jmenuitemExit.setFont(f12);
		jmenuitemExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
				ActionEvent.CTRL_MASK));
		jmenuFile.add(jmenuitemExit);
		jmenuHelp = new JMenu("Help");
		jmenuHelp.setFont(f121);
		jmenuHelp.setMnemonic(KeyEvent.VK_H);
		jmenuitemAbout = new JMenuItem("About Calculator");
		jmenuitemAbout.setFont(f12);
		jmenuHelp.add(jmenuitemAbout);
		JMenuBar mb = new JMenuBar();
		mb.add(jmenuFile);
		mb.add(jmenuHelp);
		setJMenuBar(mb);
		//Set frame layout manager
		setBackground(Color.gray);
		jplMaster = new JPanel();
		jlbOutput = new JLabel("0");
		jlbOutput.setHorizontalTextPosition(JLabel.RIGHT);
		jlbOutput.setBackground(Color.WHITE);
		jlbOutput.setOpaque(true);
		// Add components to frame
		getContentPane().add(jlbOutput, BorderLayout.NORTH);
		jbnButtons = new JButton[23];
		//		GridLayout(int rows, int cols, int hgap, int vgap)
		JPanel jplButtons = new JPanel(); // container for Jbuttons
		// Create numeric Jbuttons
		for (int i = 0; i <= 9; i++) {
			// set each Jbutton label to the value of index
			jbnButtons[i] = new JButton(String.valueOf(i));
		}
		// Create operator Jbuttons
		jbnButtons[10] = new JButton("+/-");
		jbnButtons[11] = new JButton(".");
		jbnButtons[12] = new JButton("=");
		jbnButtons[13] = new JButton("/");
		jbnButtons[14] = new JButton("*");
		jbnButtons[15] = new JButton("-");
		jbnButtons[16] = new JButton("+");
		jbnButtons[17] = new JButton("sqrt");
		jbnButtons[18] = new JButton("1/x");
		jbnButtons[19] = new JButton("%");
		jplBackSpace = new JPanel();
		jplBackSpace.setLayout(new GridLayout(1, 1, 2, 2));
		jbnButtons[20] = new JButton("Backspace");
		jplBackSpace.add(jbnButtons[20]);
		jplControl = new JPanel();
		jplControl.setLayout(new GridLayout(1, 2, 2, 2));
		jbnButtons[21] = new JButton(" CE ");
		jbnButtons[22] = new JButton("C");
		jplControl.add(jbnButtons[21]);
		jplControl.add(jbnButtons[22]);
		//Setting all Numbered JButton's to Blue. The rest to Red
		for (int i = 0; i < jbnButtons.length; i++) {
			jbnButtons[i].setFont(f12);
			if (i < 10)
				jbnButtons[i].setForeground(Color.blue);
			else
				jbnButtons[i].setForeground(Color.red);
		}
		// Set panel layout manager for a 4 by 5 grid
		jplButtons.setLayout(new GridLayout(4, 5, 2, 2));
		//Add buttons to keypad panel starting at top left
		// First row
		for (int i = 7; i <= 9; i++) {
			jplButtons.add(jbnButtons[i]);
		}
		// add button / and sqrt
		jplButtons.add(jbnButtons[13]);
		jplButtons.add(jbnButtons[17]);
		// Second row
		for (int i = 4; i <= 6; i++) {
			jplButtons.add(jbnButtons[i]);
		}
		// add button * and x^2
		jplButtons.add(jbnButtons[14]);
		jplButtons.add(jbnButtons[18]);
		// Third row
		for (int i = 1; i <= 3; i++) {
			jplButtons.add(jbnButtons[i]);
		}
		//adds button - and %
		jplButtons.add(jbnButtons[15]);
		jplButtons.add(jbnButtons[19]);
		//Fourth Row
		// add 0, +/-, ., +, and =
		jplButtons.add(jbnButtons[0]);
		jplButtons.add(jbnButtons[10]);
		jplButtons.add(jbnButtons[11]);
		jplButtons.add(jbnButtons[16]);
		jplButtons.add(jbnButtons[12]);
		jplMaster.setLayout(new BorderLayout());
		jplMaster.add(jplBackSpace, BorderLayout.WEST);
		jplMaster.add(jplControl, BorderLayout.EAST);
		jplMaster.add(jplButtons, BorderLayout.SOUTH);
		// Add components to frame
		getContentPane().add(jplMaster, BorderLayout.SOUTH);
		requestFocus();
		//activate ActionListener
		for (int i = 0; i < jbnButtons.length; i++) {
			jbnButtons[i].addActionListener(this);
		}
		jmenuitemAbout.addActionListener(this);
		jmenuitemExit.addActionListener(this);
		clearAll();
		//add WindowListener for closing frame and ending program
		addWindowListener(new WindowAdapter() {

			public void windowClosed(WindowEvent e) {
				System.exit(0);
			}
		});
	} //End of Contructor Calculator
	// Perform action
public void actionPerformed(ActionEvent e){

		double result = 0;

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

		  JDialog dlgAbout = new CustomABOUTDialog(this, 

		"About Java Swing Calculator", true);

			dlgAbout.setVisible(true);

		}else if(e.getSource() == jmenuitemExit){

			System.exit(0);

		}	

	// Search for the button pressed until end of array or key found

		for (int i=0; i< 1)
			setDisplayString("0");

			}
         		break;

			case 21:	// CE
         			clearExisting();

				break;

			case 22:	// C

				clearAll();
				break;
				}
			}
		}

	}	void setDisplayString(String s) {
		jlbOutput.setText(s);
	}
	String getDisplayString() {
		return jlbOutput.getText();
	}
	void addDigitToDisplay(int digit) {
		if (clearOnNextDigit)
			setDisplayString("");
		String inputString = getDisplayString();
		if (inputString.indexOf("0") == 0) {
			inputString = inputString.substring(1);
		}
		if ((!inputString.equals("0") || digit > 0)
				&& inputString.length() < MAX_INPUT_LENGTH) {
			setDisplayString(inputString + digit);
		}
		displayMode = INPUT_MODE;
		clearOnNextDigit = false;
	}
	void addDecimalPoint() {
		displayMode = INPUT_MODE;
		if (clearOnNextDigit)
			setDisplayString("");
		String inputString = getDisplayString();
		// If the input string already contains a decimal point, don't
		//  do anything to it.
		if (inputString.indexOf(".") < 0)
			setDisplayString(new String(inputString + "."));
	}
	void processSignChange() {
		if (displayMode == INPUT_MODE) {
			String input = getDisplayString();
			if (input.length() > 0 && !input.equals("0")) {
				if (input.indexOf("-") == 0)
					setDisplayString(input.substring(1));
				else
					setDisplayString("-" + input);
			}
		} else if (displayMode == RESULT_MODE) {
			double numberInDisplay = getNumberInDisplay();
			if (numberInDisplay != 0)
				displayResult(-numberInDisplay);
		}
	}
	void clearAll() {
		setDisplayString("0");
		lastOperator = "0";
		lastNumber = 0;
		displayMode = INPUT_MODE;
		clearOnNextDigit = true;
	}
	void clearExisting() {
		setDisplayString("0");
		clearOnNextDigit = true;
		displayMode = INPUT_MODE;
	}
	double getNumberInDisplay() {
		String input = jlbOutput.getText();
		return Double.parseDouble(input);
	}
	void processOperator(String op) {
		if (displayMode != ERROR_MODE) {
			double numberInDisplay = getNumberInDisplay();
			if (!lastOperator.equals("0")) {
				try {
					double result = processLastOperator();
					displayResult(result);
					lastNumber = result;
				} catch (DivideByZeroException e) {
				}
			} else {
				lastNumber = numberInDisplay;
			}
			clearOnNextDigit = true;
			lastOperator = op;
		}
	}
	void processEquals() {
		double result = 0;
		if (displayMode != ERROR_MODE) {
			try {
				result = processLastOperator();
				displayResult(result);
			} catch (DivideByZeroException e) {
				displayError("Cannot divide by zero!");
			}
			lastOperator = "0";
		}
	}
	double processLastOperator() throws DivideByZeroException {
		double result = 0;
		double numberInDisplay = getNumberInDisplay();
		if (lastOperator.equals("/")) {
			if (numberInDisplay == 0)
				throw (new DivideByZeroException());
			result = lastNumber / numberInDisplay;
		}
		if (lastOperator.equals("*"))
			result = lastNumber * numberInDisplay;
		if (lastOperator.equals("-"))
			result = lastNumber - numberInDisplay;
		if (lastOperator.equals("+"))
			result = lastNumber + numberInDisplay;
		return result;
	}
	void displayResult(double result) {
		setDisplayString(Double.toString(result));
		lastNumber = result;
		displayMode = RESULT_MODE;
		clearOnNextDigit = true;
	}
	void displayError(String errorMessage) {
		setDisplayString(errorMessage);
		lastNumber = 0;
		displayMode = ERROR_MODE;
		clearOnNextDigit = true;
	}
	public static void main(String args[]) {
		Calculator calci = new Calculator();
		Container contentPane = calci.getContentPane();
		//		contentPane.setLayout(new BorderLayout());
		calci.setTitle("Java Swing Calculator");
		calci.setSize(241, 217);
		calci.pack();
		calci.setLocation(400, 250);
		calci.setVisible(true);
		calci.setResizable(false);
	}
} //End of Swing Calculator Class.

class DivideByZeroException extends Exception {

	public DivideByZeroException() {
		super();
	}
	public DivideByZeroException(String s) {
		super(s);
	}
}

class CustomABOUTDialog extends JDialog implements ActionListener {

	JButton jbnOk;
	CustomABOUTDialog(JFrame parent, String title, boolean modal) {
		super(parent, title, modal);
		setBackground(Color.black);
		JPanel p1 = new JPanel(new FlowLayout(FlowLayout.CENTER));
		StringBuffer text = new StringBuffer();
		text.append("Calculator Information\n\n");
		text.append("Developer:	Hemanth\n");
		text.append("Version:	1.0");
		JTextArea jtAreaAbout = new JTextArea(5, 21);
		jtAreaAbout.setText(text.toString());
		jtAreaAbout.setFont(new Font("Times New Roman", 1, 13));
		jtAreaAbout.setEditable(false);
		p1.add(jtAreaAbout);
		p1.setBackground(Color.red);
		getContentPane().add(p1, BorderLayout.CENTER);
		JPanel p2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
		jbnOk = new JButton(" OK ");
		jbnOk.addActionListener(this);
		p2.add(jbnOk);
		getContentPane().add(p2, BorderLayout.SOUTH);
		setLocation(408, 270);
		setResizable(false);
		addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e) {
				Window aboutDialog = e.getWindow();
				aboutDialog.dispose();
			}
		});
		pack();
	}
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == jbnOk) {
			this.dispose();
		}
	}
}

Download Java Calculator Source Code

Like us on Facebook