Java GUI (Graphical User Interface) Calculator Program

Learning to write a program that adds numbers is pretty easy but getting an interface working that does it can be difficult. Not only is interface programming difficult in itself, but there are a lot of considerations regarding proper program procedure. How do you store the numbers and clear the display at the right time, etc? Well I took a couple of hours to write a Java program utilizing swing, actionlistener enabled buttons, and layout managers, to get a working calculator. It is only useful for integers right now and decimal points will have to wait, but all the right ideas are there. Here’s the source code. Study it carefully to learn Java and calculator programming in general. Remember if you cut and paste to correct the double smart quotes by retyping them manually. Eclipse is high functioning enough that it pastes them from WordPress smartly, which is stupid. :) Enjoy!

//Simple Java Calculator Program by Jeremiah Embs of EmbsComputerArt.com
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;

public class Calculator  implements ActionListener{//we are using ActionListener interface
//which allows buttons to work, but requires actionPerformed(ActionEvent e) method to
//be written to over-ride!
static boolean clsnext = false;//makes sure we clear the screen only when appropriate
static boolean flagfirstnumber = true;//makes sure we are storing the number correctly
static int a, b;//numbers to add or subtract etc.
static String operator = “”;//like PLUS, MINUS, etc.

static JPanel p2 = new JPanel();//declares a second panel to put in the window

static JTextField tf = new JTextField(30);//this is where our output displays

static JButton b0 = new JButton(“0”);//buttons
static JButton b1 = new JButton(“1”);
static JButton b2 = new JButton(“2”);
static JButton b3 = new JButton(“3”);
static JButton b4 = new JButton(“4”);
static JButton b5 = new JButton(“5”);
static JButton b6 = new JButton(“6”);
static JButton b7 = new JButton(“7”);
static JButton b8 = new JButton(“8”);
static JButton b9 = new JButton(“9”);
static JButton b10 = new JButton(“+”);
static JButton b11 = new JButton(“-“);
static JButton b12 = new JButton(“*”);
static JButton b13 = new JButton(“/”);
static JButton b14 = new JButton(“=”);
static JButton b15 = new JButton(“CLEAR”);

    public static void main(String[] args){
        
        Calculator c = new Calculator();//create an object of our own class for easy use
        //we could instead invoke eventually add.actionlistener(new Calculator())…
        //but that is calculation wasteful and all our field members (global variables)…
        //would always must be static or they would reset every time we clicked a button..
        //in the interface. I made them static none-the-less as this is correct practice…
        //for fields in the main class
        
        JFrame jf = new JFrame();//this creates a basic window object
        jf.setTitle(“JAVA CALCULATOR – BY JEREMIAH EMBS”);//setting up it’s parameters
        jf.setSize(340, 200);//size width height
        jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);//closes program when window closes
        
        JPanel p = new JPanel();//declares a panel to put in the window
        
        
        p.add(b0);//adding buttons to the panel
        p.add(b1);
        p.add(b2);
        p.add(b3);
        p.add(b4);
        p.add(b5);
        p.add(b6);
        p.add(b7);
        p.add(b8);
        p.add(b9);
        p.add(b10);
        p.add(b11);
        p.add(b12);
        p.add(b13);
        p.add(b14);
        p.add(b15);
        
        b0.addActionListener(c);//adding an action listener to each of the buttons..
        b1.addActionListener(c);//we need to invoke c which is our Calculator()..
        b2.addActionListener(c);//object to listen to actions on that to make the..
        b3.addActionListener(c);//buttons work. We could have passed..
        b4.addActionListener(c);//new Calculator() but that is a hog…
        b5.addActionListener(c);//better to just make the one object and pass it
        b6.addActionListener(c);//into the add action listener class each time.
        b7.addActionListener(c);
        b8.addActionListener(c);
        b9.addActionListener(c);
        b10.addActionListener(c);
        b11.addActionListener(c);
        b12.addActionListener(c);
        b13.addActionListener(c);
        b14.addActionListener(c);
        b15.addActionListener(c);
        
        Border border1 = BorderFactory.createRaisedBevelBorder();//border for…
        //a nicer appearance… not necessary..
        tf.setBackground(Color.lightGray);
        tf.setBorder(border1);
        
        tf.setEditable(false);//we don’t want user to be able to type in the box.
        //It’s a cheap trick but it solves error handling if they entered a bad number
        //or a string or something
                
        jf.setLayout(new BorderLayout());//sets the basic layout north,east,west,south
        
        p.setLayout(new GridLayout(5,5,5,5));//first panel’s layout is 5 rows and columns, spaced 5,5
        
        p2.add(tf);//adds the textfield to the second panel
        
        jf.add(p, BorderLayout.NORTH);//fixes the first panel to the northside
        jf.add(p2, BorderLayout.CENTER);//fixes the second panel to the southside
        jf.setVisible(true);

    }

  
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == b0){//basic button for zero
            if (clsnext == true) cls();//clear the screen if equals was last…
            //button pushed
            tf.setText(tf.getText() + “0”);//adds the number zero to the display…
            //we do this as Strings and then convert to numbers before calculation
        }
        if (e.getSource() == b1){
            if (clsnext == true) cls();
            tf.setText(tf.getText() + “1”);
        }
        if (e.getSource() == b2){
            if (clsnext == true) cls();
            tf.setText(tf.getText() + “2”);
        }
        if (e.getSource() == b3){
            if (clsnext == true) cls();
            tf.setText(tf.getText() + “3”);
        }
        if (e.getSource() == b4){
            if (clsnext == true) cls();
            tf.setText(tf.getText() + “4”);
        }
        if (e.getSource() == b5){
            if (clsnext == true) cls();
            tf.setText(tf.getText() + “5”);
        }
        if (e.getSource() == b6){
            if (clsnext == true) cls();
            tf.setText(tf.getText() + “6”);
        }
        if (e.getSource() == b7){
            if (clsnext == true) cls();
            tf.setText(tf.getText() + “7”);
        }
        if (e.getSource() == b8){
            if (clsnext == true) cls();
            tf.setText(tf.getText() + “8”);
        }
        if (e.getSource() == b9){
            if (clsnext == true) cls();
            tf.setText(tf.getText() + “9”);
        }
        if (e.getSource() == b10){
            
            a = Integer.valueOf(tf.getText());//converts the number from a String to..
            // an int and stores the number in int a.
            tf.setText(“”);//clears the display without affecting the flag
            operator = “PLUS”;//changes the operator to plus
            
        }
        if (e.getSource() == b11){
            a = Integer.valueOf(tf.getText());
            tf.setText(“”);
            operator = “MINUS”;
        }
        if (e.getSource() == b12){
            a = Integer.valueOf(tf.getText());
            tf.setText(“”);
            operator = “MULTIPLY”;
        }
        if (e.getSource() == b13){
            a = Integer.valueOf(tf.getText());
            tf.setText(“”);
            operator = “DIVIDE”;
        }
        if (e.getSource() == b14){
            
            b = Integer.valueOf(tf.getText());//converts & stores next number in int b
            
            if (operator.equalsIgnoreCase(“PLUS”)){
            tf.setText(String.valueOf(addNumbers()));//returns the sum of the numbers
            }
            
            if (operator.equalsIgnoreCase(“MINUS”)){
                tf.setText(String.valueOf(subtractNumbers()));
                }
            
            if (operator.equalsIgnoreCase(“MULTIPLY”)){
                tf.setText(String.valueOf(multiplyNumbers()));
                }
            
            if (operator.equalsIgnoreCase(“DIVIDE”)){
                tf.setText(String.valueOf(divideNumbers()));
                }
            
            clsnext = true;
            operator = “”;
        }
        if (e.getSource() == b15){
            cls();
        }
    }
    
    private int addNumbers() {
        return (a + b);
    }
    private int divideNumbers() {
        return (a / b);
    }
    private int multiplyNumbers() {
        return (a * b);
    }
    private int subtractNumbers() {
        return (a – b);
    }

    private void cls() {//clears the display and resets flag for clearing screen
        tf.setText(“”);
        clsnext = false;
    }
}//end of file