14
Jan
M255 Java Calculator
Having completed the Open University course M255 I decided I wanted to put my new found knowledge to use. I needed a project, and wanted to learn about how user interfaces are programmed in Java.
A Calculator seemed like a good project, but I set myself a few restrictions, they were;
- Not allowed to use an ‘Integrated Development Environment’, I used the VI text editor instead.
- Use compiler (javac) and Java Virtual Machine (java) to run it from the command line.
- Not allowed to look at how other people had programmed a calculator
- The only source of help was my knowledge of Java from M255, and, The Java Tutorials at the Sun website.
One of the reasons for putting the details of the project on the web was to show others what can be achieved after completing M255, and to welcome feedback from people, including experienced developers.

Source and Design
This project has been split into phases to make development more manageable within the limited time I have. Initialy I wanted to create a user interface that responded to all the events I needed and then make it work like a calculator. What surprised me was that it only took an hour and a half to create the user interface, being that I am no expert means I have probably not implemented it as well as I could have, but thats why ive signed up for M257.
Future enhancements
As anyone working in software development knows, programs always evolve, and the Calculator is no different, I see the code/implementation changing as I receive comments from more experienced Java developers, and to add the following;
- Convert into an Applet so people can see the Calculator on the web without having to download it and run it locally.
- Add support for keyboard use, at present this is purely mouse driven.
- Nested brackets
- Improve the layout of the interface, it could look better.
- Add other scientific functions, maybe even graphs as I get really adventurous.
- … and more as either I think of them or people suggest them.
Warning!
As I am no expert on Java or Java user interfaces I obviously have no idea if there is a better way of achieving what I want, or for that matter if I have committed any sins in the code I have created; however, I hope this project evolves and can become a case study tracing the evolution of the calculator from the original source (v1.0) through it’s evolution into a more show case calculator program.
This is a purely educational project; I don’t see this being of any real use to any one other than to learn from.
Tags: Brackets, Calculator Features, Calculator Java, Code Implementation, Description Classes, Developers Source, Hour And A Half, Integrated Development Environment, Java Calculator, Java Developers, Java Tutorials, Java Virtual Machine, Javac, Open University, Original Version, Scient, Sun Website, User Interface, User Interfaces, Version Description, Virtual Machine Java
Filed under: Software Development
14
Jan
Preperation
Should you not have the Java Virtual Machine (JVM) you can find it at java.sun.com, this is used to run Java programs. There are several ways you can run the Calculator, the way I have been running it is to place both class files in a directory, compile them both and then run the Calculator class, I used cygwin but a DOS prompt or any other shell should also be ok.
You can use an Integration Development Environment (IDE) to run the Calculator, instead of the command line; however, if your not using an IDE you might find the following usefull.
Compiling and running using a shell
Once you have your shell/DOS prompt you will want to create a suitably named directory, and then place both class files in it. The following shows where you should be in the directory structure and what files you should see in there.
$ pwd
/home/user/java/Calculator
user@user ~/java/Calculator
$ ls
Calculation.java Calculator.java
Then from within the directory where the class files are, compile the class files using javac as follows.
$ javac Calculator.java
user@user ~/java/Calculator
$ javac Calculation.java
Once compiled you should see a few extra files, these will have a .class file extension, and they contain the bytecode which JVM will uses to execute, in this case resulting in the Calculator running and the user interface being displayed.
user@user ~/java/Calculator
$ ls
Calculation.class Calculator$1.class Calculator.java
Calculation.java Calculator.class
Now you are ready to run the Calculator using the following command;
user@user ~/java/Calculator
$ java -classpath . Calculator
Assuming you have done everything correctly you should see something similar to the following;

Tags: Bytecode, Calculator Instructions, Calculator Java, Calculator User, Development Environment, Directory Structure, Dos Prompt, File Extension, Integration Development, Java Calculator, Java Classpath, Java Programs, Java Sun, Java User, Java Virtual Machine, Java Virtual Machine Jvm, Several Ways, Shell Dos, Usefull, User Interface
Filed under: Software Development
14
Jan
Calculator Class
Description
Provides the graphical user interface of the calculator. Looking at the code you will see the method;
public void actionPerformed(ActionEvent e)
which is the central hub of the Calculator, it is the point at which the user actions (events) are turned into sequences of actions that result in calculations being performed, and their result being shown to the user.
Source
/*
* Calculator
*
* Russell Smithers
* 26 October 2006
*
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculator implements ActionListener
{
// Display area references
public JPanel mainPanel, selectPanel, displayPanel, actionPanel, memoryPanel;
private JLabel displayScreen;
// Calculation references and variables
Calculation currentCalc;
StringBuilder screenValue;
double value;
char valueInput;
/**
* Create a GUI Calculator - sets up swing with relevant controls
*/
public Calculator()
{
// Main panel that holds all controls
mainPanel = new JPanel();
mainPanel.setLayout(new GridLayout(0,2));
mainPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
// Screen areas
this.displayPanel = this.addPanel("Result",0,0);
this.memoryPanel = this.addPanel("Memory",0,1);
this.selectPanel = this.addPanel("Keypad",0,3);
this.actionPanel = this.addPanel("Operations",0,1);
// Number buttons
for (int button=9; button>=0; button--)
{ this.addButton(selectPanel, "" + button); }
this.addButton(selectPanel, ".");
this.addButton(selectPanel, "Clr");
// Operation buttons
this.addButton(actionPanel, "+");
this.addButton(actionPanel, "-");
this.addButton(actionPanel, "/");
this.addButton(actionPanel, "*");
this.addButton(actionPanel, "=");
// Output area
displayScreen = new JLabel();
this.displayPanel.add( displayScreen );
screenValue = new StringBuilder();
currentCalc = new Calculation();
}
/**
* Event handler which handles all input
*/
public void actionPerformed(ActionEvent e)
{
// System.out.println("Button pressed: " + e.getActionCommand() );
String valueOrig = e.getActionCommand();
this.valueInput = valueOrig.charAt(0);
if ( Calculation.operationValid(valueInput) )
{
try
{
this.value = Double.valueOf(screenValue.toString()).doubleValue();
}
catch(Exception anError)
{
this.value = 0.0;
}
currentCalc.calculate( this.value, valueInput);
this.updateDisplay();
}
else
{
if ( Character.isDigit(this.valueInput) || this.valueInput == '.')
{
screenValue.append( this.valueInput );
this.displayScreen.setText( screenValue.toString() );
}
else
{
switch(this.valueInput)
{
case 'C': currentCalc.setValue(0.0);
}
this.updateDisplay();
}
}
}
/**
* Set calculator value
*/
public void updateDisplay()
{
this.displayScreen.setText( Double.toString(currentCalc.getValue()) );
this.screenValue = new StringBuilder();
}
/**
* Add a button with an ActionListener and then add it to a panel
*/
private void addButton(JPanel p, String value)
{
JButton tempButton = new JButton(value);
tempButton.addActionListener(this);
p.add(tempButton);
}
/**
* Adds a new panel the main container panel and sets default decoration
*/
private JPanel addPanel(String title, int x, int y)
{
JPanel tempPanel = new JPanel();
// Set GridLayout is we have relevant values to use on
if ( (x > 0) || (y >0) )
{ tempPanel.setLayout(new GridLayout(x,y)); }
// Set the panel decoration
tempPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(title), BorderFactory.createEmptyBorder(5,5,5,5)));
// Add ths panel to the main one
this.mainPanel.add(tempPanel);
return tempPanel;
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI()
{
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
Calculator calcy = new Calculator();
//Create and set up the window.
JFrame calculatorFrame = new JFrame("Calculator v1.0 (rsmithers.net)");
calculatorFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
calculatorFrame.setContentPane(calcy.mainPanel);
//Display the window.
calculatorFrame.pack();
calculatorFrame.setVisible(true);
}
/**
* Entry point for Calculator program
*/
public static void main(String[] args)
{
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}
Tags: 26 October, Actionevent, Awt Event, Central Hub, Class Description, Getac, Graphical User Interface, Gridlayout, Implements, Import Java, Java Awt, Java Calculator, Jlabel, Number Buttons, Public Void, Relevant Controls, Screen Areas, Sequences, Setborder, Setlayout, Smithers
Filed under: Software Development