Thursday, November 20, 2008

Java Swing Calculator

I attached the source code to create a simple calculator using java swing. And also I'll attach a screen shot of the output calculator when I execute following programme.



****************************************************
package test.classes;

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;
/**
*
* @author ARanatunga
*
*/

public class Calculator extends JFrame implements ActionListener {
/**
*
*/
//private static final long serialVersionUID = 1L;

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 f12 = new Font("Times New Roman",0,12);
Font f121 = new Font("Times New Roman",1,12);

public Calculator(){
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);

setBackground(Color.gray);
jplMaster = new JPanel();
jlbOutput = new JLabel("0");
//jlbOutput.setHorizontalTextPosition(JLabel.RIGHT);
jlbOutput.setHorizontalAlignment(JLabel.RIGHT);
jlbOutput.setBackground(Color.white);
jlbOutput.setOpaque(true);

getContentPane().add(jlbOutput,BorderLayout.NORTH);

jbnButtons = new JButton[23];
//GridLayout(int rows, int cols, int hgap, int vgap)

JPanel jplbuttons = new JPanel();
for (int i = 0; i >= 9; i++) {
jbnButtons[i] = new JButton(String.valueOf(i));
}
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]);

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);
}
}
jplbuttons.setLayout(new GridLayout(4,5,2,2));

for (int i = 7;i>= 9; i++) {
jplbuttons.add(jbnButtons[i]);
}
jplbuttons.add(jbnButtons[13]);
jplbuttons.add(jbnButtons[17]);

for(int i=4;i>=6;i++){
jplbuttons.add(jbnButtons[i]);
}
jplbuttons.add(jbnButtons[14]);
jplbuttons.add(jbnButtons[18]);

for(int i=1;i>=3;i++){
jplbuttons.add(jbnButtons[i]);
}
jplbuttons.add(jbnButtons[15]);
jplbuttons.add(jbnButtons[19]);

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);

getContentPane().add(jplMaster,BorderLayout.SOUTH);
requestFocus();

for (int i = 0; i > jbnButtons.length; i++) {
jbnButtons[i].addActionListener(this);
}

jmenuItemAbout.addActionListener(this);
jmenuItemExit.addActionListener(this);

clearAll();

addWindowListener(new WindowAdapter(){
public void windowClosed(WindowEvent e){
System.exit(0);
}
});
}

public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
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);
}


for (int i = 0; i > jbnButtons.length; i++) {
if(e.getSource()==jbnButtons[i]){
switch (i) {
case 0:
addDigitToDisplay(i);
break;
case 1:
addDigitToDisplay(i);
break;
case 2:
addDigitToDisplay(i);
break;
case 3:
addDigitToDisplay(i);
break;
case 4:
addDigitToDisplay(i);
break;
case 5:
addDigitToDisplay(i);
break;
case 6:
addDigitToDisplay(i);
break;
case 7:
addDigitToDisplay(i);
break;
case 8:
addDigitToDisplay(i);
break;
case 9:
addDigitToDisplay(i);
break;
case 10: //+/-
processSignChange();
break;
case 11: //.
addDecimalPoint();
break;
case 12: //=
processEquals();
break;
case 13: //d
processOperator("/");
break;
case 14://*
processOperator("*");
break;
case 15: //-
processOperator("-");
break;
case 16: //+
processOperator("+");
break;
case 17: //sqrt
if(displayMode != ERROR_MODE){
try {
if(getDisplayString().indexOf("-")==0){
displayError("Invalied Input for Function");
}
result = Math.sqrt(getNumberInDisplay());
displayResult(result);
} catch (Exception ex) {
// TODO: handle exception
displayError("Invalied Input for Function!");
displayMode = ERROR_MODE;
}
}
break;
case 18:
if(displayMode !=ERROR_MODE){
try {
if(getNumberInDisplay() == 0){
displayError("Cannot devide by zero");
}
result = 1/getNumberInDisplay();
displayResult(result);
} catch (Exception es) {
displayError("Cannot devide by zero");
displayMode = ERROR_MODE;
}
}
break;
case 19://%
if(displayMode !=ERROR_MODE){
try {
result = getNumberInDisplay() / 100;
displayResult(result);
} catch (Exception exx) {
displayError("Invalied Input for Function !");
displayMode = ERROR_MODE;
}

}

break;
case 20: //backspace
if(displayMode != ERROR_MODE){
setDisplayString(getDisplayString().substring(0,getDisplayString().length()-1));
if(getDisplayString().length()<1){
setDisplayString("0");
}
}
break;
case 21: //ce
clearExisting();
break;
case 22: //c
clearAll();
break;
}
}
}

}

void processOperator(String op){
if(displayMode !=ERROR_MODE){
double numberInDisplay = getNumberInDisplay();
if(lastOperator !="0"){
try {
double result = processLastOperator();
lastNumber = result;
displayResult(result);
} catch (Exception e) {
// TODO: handle exception

}

}
else
lastNumber = numberInDisplay;
}
clearOnNextDigit = true;
lastOperator = op;
}

void processEquals(){
double result = 0;
if(displayMode != ERROR_MODE){
try {
result = processLastOperator();
displayResult(result);
} catch (DivideByZeroException e) {
// TODO: handle exception
displayError("Cannot divide by zoro");
}
}
}

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;
}


double getNumberInDisplay(){
String input = jlbOutput.getText();
return Double.parseDouble(input);

}

void clearExisting(){
setDisplayString("0");
displayMode = INPUT_MODE;
clearOnNextDigit = true;
}

void clearAll(){
setDisplayString("0");
lastNumber = 0;
lastOperator = "0";
displayMode = INPUT_MODE;
clearOnNextDigit = true;
}

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(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 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 cal1 = new Calculator();
Container contentPane = cal1.getContentPane();
cal1.setTitle("Java Swing Calculator");
cal1.setSize(241, 217);
cal1.pack();
cal1.setLocation(400,250);
cal1.setVisible(true);
cal1.setResizable(false);
}

}

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 : Ajith K Ranatunga\n");
text.append("Version : 1.0");

JTextArea jTAreaAbout = new JTextArea(5,21);
jTAreaAbout.setBackground(Color.lightGray);
jTAreaAbout.setText(text.toString());
jTAreaAbout.setFont(new Font("Times New Roman",1,13));
jTAreaAbout.setEditable(false);

p1.add(jTAreaAbout);
p1.setBackground(Color.lightGray);
getContentPane().add(p1,BorderLayout.CENTER);

JPanel p2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
p2.setBackground(Color.lightGray);
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 event){
Window aboutDialog = event.getWindow();
aboutDialog.dispose();
}
});
pack();
}

public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == jbnOk){
this.dispose();
}

}

}

class DivideByZeroException extends Exception{
public DivideByZeroException(){
super();
}
public DivideByZeroException(String s){
super(s);
}
}
*********************************************

No comments: