Scientific Calculator in Java
This article will help you create your own Swing GUI Scientific Calculator in Java. I will provide you with the source code and explain the major functions of the program. You can use this as a starting point for your own projects or just use it as is. It includes all the basic functionalities of a scientific calculator, including the ability to evaluate expressions and view results with parentheses.
Project Overview: Swing GUI Scientific Calculator in Java
- Project Name: Swing GUI Scientific Calculator in Java
- Abstract: A GUI-based project utilizing the Swing module to organize elements for a scientific calculator.
- Languages Used: Java
- IDE: IntelliJ IDEA Professional (Recommended)
- Java Version (Recommended): Java SE 18.0.2.1
- Database: Not required
- Type: Desktop Application
- Recommended for: Intermediate to Advanced Java developers
- Time Needed for Project: 2 – 2.5 hours
What Will You Learn?
- The Math class in Java
- Handling classes and object creation
- Using functions, loops, conditionals, and variables
- Utilizing Java Swing and Java AWT for creating a user-friendly GUI
Features
- Addition, Subtraction, Multiplication, and Division
- Finding Sin, Cos, Tan, Log, Factorial, Pi, Square, and Square root of a number
Complete Code for Scientific Calculator in Java
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class Calculator {
JFrame frmCalculator;
String result="",expression="";
ArrayList token=new ArrayList();
boolean num=false;
boolean dot=false;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Calculator window = new Calculator();
window.frmCalculator.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
Calculator() {
initialize();
}
int precedence(String x)
{
int p=10;
switch(x) {
case "+":
p=1;
break;
case "-":
p=2;
break;
case "x":
p=3;
break;
case "/":
p=4;
break;
case "^":
p=6;
break;
case "!":
p=7;
break;
}
return p;
}
//operator checking
private boolean isoperator(String x)
{
if(x.equals("+") || x.equals("-") || x.equals("x") || x.equals("/") || x.equals("sqrt") || x.equals("^") || x.equals("!") || x.equals("sin") || x.equals("cos") || x.equals("tan") || x.equals("ln") || x.equals("log"))
return true;
else
return false;
}
private String infixTopostfix()
{
Stack s=new Stack();
String y;
int flag;
String p="";
token.add(")");
s.push("(");
for(String i: token) {
if(i.equals("(")){
s.push(i);
}else if(i.equals(")")){
y=s.pop();
while(!y.equals("("))
{
p=p+y+",";
y=s.pop();
}
}else if(isoperator(i)){
y=s.pop();
flag=0;
if(isoperator(y) && precedence(y)>precedence(i)){
p=p+y+",";
flag=1;
}
if(flag==0)
s.push(y);
s.push(i);
}else{
p=p+i+",";
}
}
while(!s.empty()) {
y=s.pop();
if(!y.equals("(") && !y.equals(")")) {
p+=y+",";
}
}
return p;
}
//factorial method
private double factorial(double y) {
double fact=1;
if(y==0 || y==1) {
fact=1;
}else {
for(int i=2; i<=y; i++) {
fact*=i;
}
}
return fact;
}
//for actual calculation with binary operators
private double calculate(double x,double y,String c)
{
double res=0;
switch(c)
{
case "-":
res= x-y;
break;
case "+":
res= x+y;
break;
case "x":
res= x*y;
break;
case "/":
res= x/y;
break;
case "^":
res= Math.pow(x,y);
break;
default :
res= 0;
}
return res;
}
//calculation with unary operators
private double calculate(double y,String c) {
double res=0;
switch(c) {
case "log":
res = Math.log10(y);
break;
case "sin":
res= Math.sin(y);
break;
case "cos":
res = Math.cos(y);
break;
case "tan":
res =Math.tan(y);
break;
case "ln":
res= Math.log(y);
break;
case "sqrt":
res= Math.sqrt(y);
break;
case "!":
res=factorial(y);
break;
}
return res;
}
private double Eval(String p)
{
String tokens[] = p.split(",");
ArrayList token2=new ArrayList();
for(int i=0; i s=new Stack();
double x,y;
for(String i:token2) {
if(isoperator(i)){
//if it is unary operator or function
if(i.equals("sin") ||i.equals("cos") ||i.equals("tan") ||i.equals("log") || i.equals("ln") || i.equals("sqrt") || i.equals("!")) {
y=s.pop();
s.push(calculate(y,i));
}else {
//for binary operators
y=s.pop();
x=s.pop();
s.push(calculate(x,y,i));
}
}else{
if(i.equals("pi"))
s.push(Math.PI);
else if(i.equals("e"))
s.push(Math.E);
else
s.push(Double.valueOf(i));
}
}
double res=1;
while(!s.empty()) {
res*=s.pop();
}
return res; //final result
}
//actual combined method for calculation
private void calculateMain() {
String tokens[]=expression.split(",");
for(int i=0; i 1) {
String newString = s.substring(0,s.length()-1);
textField.setText(newString);
if(expression.charAt(expression.length()-1)=='.') {
dot=false;
}
if(expression.charAt(expression.length()-1) == ',') {
expression = expression.substring(0,expression.length()-2);
}else {
expression = expression.substring(0,expression.length()-1);
}
}else {
textField.setText("0");
expression="";
}
}
});
button2.setFont(new Font("Calibri Light", Font.PLAIN, 14));
butttonPanel.add(button2);
//button for constant pi
JButton button3 = new JButton("Ï€");
button3.setFont(new Font("Calibri Light", Font.PLAIN, 17));
button3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+Character.toString((char)960));
}else {
textField.setText(Character.toString((char)960));
}
expression += ",pi";
num=false;
dot=false;
}
});
butttonPanel.add(button3);
//button for x^Y
JButton button4 = new JButton("Xy");
button4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"^");
expression+=",^";
}else {
textField.setText("0^");
expression += ",0,^";
}
num=false;
dot=false;
}
});
button4.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button4);
//factorial button
JButton buttton5 = new JButton("x!");
buttton5.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"!");
expression+=",!";
}else {
textField.setText("0!");
expression+=",0,!";
}
num=false;
dot=false;
}
});
buttton5.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(buttton5);
//button for sin
JButton button6 = new JButton("sin");
button6.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"sin(");
}else {
textField.setText("sin(");
}
expression+=",sin,(";
num=false;
dot=false;
}
});
button6.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button6);
JButton button7 = new JButton("(");
button7.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"(");
}else {
textField.setText("(");
}
expression+=",(";
num=false;
dot=false;
}
});
button7.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button7);
JButton button8 = new JButton(")");
button8.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+")");
}else {
textField.setText(")");
}
expression+=",)";
num=false;
dot=false;
}
});
button8.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button8);
JButton button9 = new JButton("e");
button9.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"e");
}else {
textField.setText("e");
}
expression+=",e";
num=false;
dot=false;
}
});
button9.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button9);
//button for squre root
JButton button10 = new JButton("√");
button10.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+Character.toString((char)8730));
}else {
textField.setText(Character.toString((char)8730));
}
expression+=",sqrt";
num=false;
dot=false;
}
});
button10.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button10);
JButton button11 = new JButton("cos");
button11.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"cos(");
}else {
textField.setText("cos(");
}
expression+=",cos,(";
num=false;
dot=false;
}
});
button11.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button11);
JButton button12 = new JButton("7");
button12.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"7");
}else {
textField.setText("7");
}
if(num) {
expression+="7";
}else {
expression+=",7";
}
num=true;
}
});
button12.setBackground(new Color(220, 220, 220));
button12.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button12);
JButton button13 = new JButton("8");
button13.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"8");
}else {
textField.setText("8");
}
if(num) {
expression+="8";
}else {
expression+=",8";
}
num=true;
}
});
button13.setBackground(new Color(220, 220, 220));
button13.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button13);
JButton button14 = new JButton("9");
button14.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"9");
}else {
textField.setText("9");
}
if(num) {
expression+="9";
}else {
expression+=",9";
}
num=true;
}
});
button14.setBackground(new Color(220, 220, 220));
button14.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button14);
//button for division operator
JButton button15 = new JButton("÷");
button15.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s=textField.getText();
if(s.equals("0")) {
expression+="0";
}
if(s.charAt(s.length()-1)== '-' || s.charAt(s.length()-1)== 'x' || s.charAt(s.length()-1) == '+') {
String newString = s.substring(0,s.length()-1);
textField.setText(newString+Character.toString((char)247));
expression = expression.substring(0,expression.length()-1);
expression += "/";
}else if(s.charAt(s.length()-1)!= (char)247) {
textField.setText(s+Character.toString((char)247));
expression+=",/";
}else {
textField.setText(s);
}
num=false;
dot=false;
}
});
button15.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button15);
JButton button16 = new JButton("tan");
button16.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"tan(");
}else {
textField.setText("tan(");
}
expression+=",tan,(";
num=false;
dot=false;
}
});
button16.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button16);
JButton button17 = new JButton("4");
button17.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"4");
}else {
textField.setText("4");
}
if(num) {
expression+="4";
}else {
expression+=",4";
}
num=true;
}
});
button17.setBackground(new Color(220, 220, 220));
button17.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button17);
JButton button18 = new JButton("5");
button18.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"5");
}else {
textField.setText("5");
}
if(num) {
expression+="5";
}else {
expression+=",5";
}
num=true;
}
});
button18.setBackground(new Color(220, 220, 220));
button18.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button18);
JButton button19 = new JButton("6");
button19.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"6");
}else {
textField.setText("6");
}
if(num) {
expression+="6";
}else {
expression+=",6";
}
num=true;
}
});
button19.setBackground(new Color(220, 220, 220));
button19.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button19);
JButton button20 = new JButton("x");
button20.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s=textField.getText();
if(s.equals("0")) {
expression+="0";
}
if(s.charAt(s.length()-1)== '-' || s.charAt(s.length()-1)== '+' || s.charAt(s.length()-1) == (char)(247)) {
String newString = s.substring(0,s.length()-1);
newString += "x";
textField.setText(newString);
expression = expression.substring(0,expression.length()-1);
expression += "x";
}else if(s.charAt(s.length()-1)!= 'x') {
s += "x";
textField.setText(s);
expression+=",x";
}else {
textField.setText(s);
}
num=false;
dot=false;
}
});
button20.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button20);
JButton button21 = new JButton("ln");
button21.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"ln(");
}else {
textField.setText("ln(");
}
expression+=",ln,(";
num=false;
dot=false;
}
});
button21.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button21);
JButton button22 = new JButton("1");
button22.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"1");
}else {
textField.setText("1");
}
if(num) {
expression+="1";
}else {
expression+=",1";
}
num=true;
}
});
button22.setBackground(new Color(220, 220, 220));
button22.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button22);
JButton button23 = new JButton("2");
button23.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"2");
}else {
textField.setText("2");
}
if(num) {
expression+="2";
}else {
expression+=",2";
}
num=true;
}
});
button23.setBackground(new Color(220, 220, 220));
button23.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button23);
JButton button24 = new JButton("3");
button24.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"3");
}else {
textField.setText("3");
}
if(num) {
expression+="3";
}else {
expression+=",3";
}
num=true;
}
});
button24.setBackground(new Color(220, 220, 220));
button24.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button24);
JButton button25 = new JButton("-");
button25.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s=textField.getText();
if(s.equals("0")) {
expression+="0";
}
if(s.charAt(s.length()-1)== '+') {
String newString = s.substring(0,s.length()-1);
newString += "-";
expression = expression.substring(0,expression.length()-1);
expression += "-";
textField.setText(newString);
}else if(s.charAt(s.length()-1)!= '-') {
s += "-";
textField.setText(s);
expression += ",-";
}else {
textField.setText(s);
}
num=false;
dot=false;
}
});
button25.setFont(new Font("Calibri Light", Font.BOLD, 23));
butttonPanel.add(button25);
JButton button26 = new JButton("log10");
button26.setFont(new Font("Calibri Light", Font.PLAIN, 17));
button26.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(! "0".equals(textField.getText())) {
textField.setText(textField.getText()+"log(");
}else {
textField.setText("log(");
}
expression+=",log,(";
num=false;
dot=false;
}
});
butttonPanel.add(button26);
JButton button27 = new JButton(".");
button27.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s=textField.getText();
if(s.charAt(s.length()-1)!= '.') {
if(num && dot==false) {
expression+=".";
s += ".";
}else if(num==false && dot ==false){
expression+=",.";
s += ".";
}
}
num=true;
dot=true;
textField.setText(s);
}
});
button27.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button27);
JButton button28 = new JButton("0");
button28.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if("0".equals(textField.getText())) {
textField.setText("0");
}else {
textField.setText(textField.getText()+"0");
if(num) {
expression+="0";
}
else {
expression+=",0";
}
}
num=true;
}
});
button28.setBackground(new Color(220, 220, 220));
button28.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button28);
//actual functioning on clicking = button
JButton button29 = new JButton("=");
button29.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
calculateMain();
String s="";
token.remove(token.size()-1);
for(String i: token) {
if(i.equals("/")) {
s+=Character.toString((char)247);
}else if(i.equals("sqrt")) {
s+=Character.toString((char)8730);
}else if(i.equals("pi")) {
s+=Character.toString((char)960);
}else {
s+=i;
}
}
exprlabel.setText(s+"=");
textField.setText(result);
expression = result;
dot=true;
num=true;
token.clear();
}
});
button29.setBackground(Color.ORANGE);
button29.setFont(new Font("Calibri Light", Font.PLAIN, 22));
butttonPanel.add(button29);
JButton button30 = new JButton("+");
button30.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s=textField.getText();
if(s.equals("0")) {
expression+="0";
}
if(s.charAt(s.length()-1)== '-' || s.charAt(s.length()-1)== 'x' || s.charAt(s.length()-1) == (char)(247)) {
String newString = s.substring(0,s.length()-1);
newString += "+";
textField.setText(newString);
expression = expression.substring(0,expression.length()-1);
expression += "+";
}else if(s.charAt(s.length()-1)!= '+') {
s += "+";
textField.setText(s);
expression+=",+";
}else {
textField.setText(s);
}
num=false;
dot=false;
}
});
button30.setFont(new Font("Calibri Light", Font.PLAIN, 17));
butttonPanel.add(button30);
frmCalculator.setBounds(200, 100, 400, 500);
frmCalculator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

0 Comments: