Would you like to make this site your homepage? It's fast and easy...
Yes, Please make this my home page!
Java Project - Calculator
This calculator application was built together with the calculator
applications written in vb java/applet.
They all look and operate similarly, however, I've only
just corrected a "banker's rounding" discrepancy in both this and the
java/applet programs. At the time of writing (30 May 2003) there appear to be no
side-effects from the changes made.
Try the java/applet version here (written without swing components)
use mouse or keyboard
Shortcut keys Cancel - C, Clear All - A, Clr List - L
Click to see versions in
vb
java/applet
Java/Swing Code
import javax.swing.*;
import java.awt.*;
import
java.awt.event.*;
import java.text.*;
class Calculator extends JFrame implements ActionListener,
ItemListener,
KeyListener, MouseListener, FocusListener
{
JList list;
DefaultListModel myListModel;
JScrollPane listScroll;
JRadioButton radioBtn[] = new JRadioButton[6];
ButtonGroup
radioGrp;
JLabel radioLbl[] = new JLabel[7];
JButton btn[] =
new JButton[20];
JTextField txtFld;
boolean calculated;
String lastEntry;
String
currentTotal;
int lastOperator = 1; //1 for +, 2 for -, 3
for =,4 for x, 5 for ÷
int decimalPlaces = 2;
DecimalFormat
df;
public static void main(String args[])
{
Calculator calc = new Calculator();
}
public Calculator()
{
super("Calculator");
setSize(600,350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
buildGUI();
pack();
setResizable(false);
setVisible(true);
setDecimalPlaces();
clearAll();
setTheFocus();
}
private void cancel()
{
txtFld.setText(currentTotal);
calculated =
true;
setTheFocus();
}
private void clearAll()
{
addToJList("<Clr> ");
txtFld.setText(df.format(Double.parseDouble("0")));
calculated = true;
lastEntry =
df.format(Double.parseDouble("0"));
currentTotal =
df.format(Double.parseDouble("0"));
setTheFocus();
}
private void clearList()
{
myListModel.clear();
addToJList("<Clr>
");
setTheFocus();
}
private void setDecimalPlaces()
{
String decimals[] =
{"0","0.0","0.00","0.000","0.0000","0.00000"};
df = new
DecimalFormat(decimals[decimalPlaces]);
}
private void setTheFocus()
{
txtFld.setCaretPosition(txtFld.getText().length());
txtFld.grabFocus();
}
private void addToJList(String number)
{
int extra = 0;
if(number.length()
> 5) extra = number.length()/2-1;
if(number.length()
> 7) extra += (number.length()-7)/2;
for(int i = 0; i
< 55-number.length()-extra; i++)
{
number = " " + number;
}
myListModel.addElement(number);
list.setModel(myListModel);
list.setSelectedIndex(myListModel.getSize()-1);
list.ensureIndexIsVisible(myListModel.getSize()-1);
setTheFocus();
}
//------------------------------------------VALIDATE/KEYBOARD
ACTIONS
private boolean validKey(char keyPressed)
{
boolean valid = false;
if(keyPressed == '0' || keyPressed == '1' || keyPressed
== '2' ||
keyPressed == '3' ||
keyPressed == '4' || keyPressed == '5'
||
keyPressed == '6' || keyPressed ==
'7' || keyPressed == '8' ||
keyPressed
== '9' || keyPressed == '.')
{
valid = true;
if(calculated)
{
txtFld.setText("");
calculated =
false;
}
if((keyPressed == '.' && txtFld.getText().indexOf(".") > -1)
||
!
checkLength())
{
valid =
false;
}
}
else if(keyPressed == '+')
addNumber();
else if(keyPressed == '-')
subtractNumber();
else if(keyPressed == '*')
multiplyNumber(false);
else if(keyPressed == '/')
divideNumber(false);
else if(keyPressed ==
KeyEvent.VK_ENTER) equals();
else if(keyPressed == 'C' ||
keyPressed == 'c') cancel();
else if(keyPressed == 'A' ||
keyPressed == 'a') clearAll();
else if(keyPressed == 'L'
|| keyPressed == 'l') clearList();
return valid;
}
private boolean checkLength()
{
boolean OK = true;
if((txtFld.getText().indexOf(".") >
-1 &&
txtFld.getText().length() > 12) ||
(txtFld.getText().indexOf(".") < 0
&&
txtFld.getText().length() > 11))
{
OK = false;
}
return OK;
}
//--------------------------------------------------ACTIONS FOR + - * /
=
private void addNumber()
{
double
decNumber =
Math.abs(Double.parseDouble(
calculated? lastEntry:txtFld.getText()));
String formattedNumber =
df.format(decNumber);
currentTotal =
df.format(Double.parseDouble(currentTotal)+decNumber);
txtFld.setText(currentTotal);
addToJList(formattedNumber +
" +");
lastEntry = formattedNumber;
calculated = true;
lastOperator = 1;
setTheFocus();
}
private void subtractNumber()
{
double decNumber =
Math.abs(Double.parseDouble(
calculated? lastEntry:txtFld.getText()));
String formattedNumber =
df.format(decNumber);
currentTotal =
df.format(Double.parseDouble(currentTotal)-decNumber);
txtFld.setText(currentTotal);
addToJList(formattedNumber +
" -");
lastEntry = formattedNumber;
calculated = true;
lastOperator = 2;
setTheFocus();
}
private void multiplyNumber(boolean fromEqualsOperater)
{
boolean zeroNumber = false;
double decNumber =
Double.parseDouble(txtFld.getText());
String
formattedNumber = String.valueOf(decNumber);
if(lastOperator < 4)
{
currentTotal = lastEntry =
formattedNumber;
}
else
if(calculated)
{
currentTotal =
df.format(Double.parseDouble(currentTotal)
*
Double.parseDouble(lastEntry));
}
else if(lastOperator == 5)
{
currentTotal =
df.format(((long)((Double.parseDouble(currentTotal) / decNumber)
*
Math.pow(10,decimalPlaces) +
0.5))/Math.pow(10,decimalPlaces));
}
else
{
currentTotal =
df.format(((long)((Double.parseDouble(currentTotal) * decNumber)
*
Math.pow(10,decimalPlaces) +
0.5))/Math.pow(10,decimalPlaces));
}
txtFld.setText(currentTotal);
if((int) decNumber - decNumber == 0)
{
formattedNumber =
formattedNumber.substring(0,formattedNumber.lastIndexOf("."));
zeroNumber = true;
}
if(!
fromEqualsOperater)
{
addToJList(formattedNumber + " x");
}
else if(zeroNumber)
{
addToJList(formattedNumber + "
");
}
else
{
addToJList(formattedNumber + "
");
}
calculated =
true;
lastOperator = 4;
setTheFocus();
}
private void divideNumber(boolean fromEqualsOperater)
{
boolean zeroNumber = false;
double decNumber =
Double.parseDouble(txtFld.getText());
String
formattedNumber = String.valueOf(decNumber);
if(lastOperator < 4)
{
currentTotal = lastEntry =
formattedNumber;
}
else
if(calculated)
{
currentTotal =
df.format(Double.parseDouble(currentTotal)
/
Double.parseDouble(lastEntry));
}
else if(lastOperator == 4)
{
currentTotal =
df.format(((long)((Double.parseDouble(currentTotal) * decNumber)
*
Math.pow(10,decimalPlaces) +
0.5))/Math.pow(10,decimalPlaces));
}
else
{
currentTotal =
df.format(((long)((Double.parseDouble(currentTotal) / decNumber)
*
Math.pow(10,decimalPlaces) +
0.5))/Math.pow(10,decimalPlaces));
}
txtFld.setText(currentTotal);
if((int) decNumber - decNumber == 0)
{
formattedNumber =
formattedNumber.substring(0,formattedNumber.lastIndexOf("."));
zeroNumber = true;
}
if(!
fromEqualsOperater)
{
addToJList(formattedNumber + " ÷");
}
else if(zeroNumber)
{
addToJList(formattedNumber + "
");
}
else
{
addToJList(formattedNumber + "
");
}
calculated =
true;
lastOperator = 5;
setTheFocus();
}
private void equals()
{
if(lastOperator != 3)
{
if(! calculated && lastOperator < 3)
addNumber();
if(! calculated &&
lastOperator == 4) multiplyNumber(true);
if(!
calculated && lastOperator == 5)
divideNumber(true);
addToJList(currentTotal +
" =");
addToJList("...
");
lastEntry =
currentTotal;
currentTotal =
df.format(0.0);
calculated =
true;
lastOperator =
3;
setTheFocus();
}
else
{
clearAll();
}
}
//----------------------------------------------------KEYPAD
ACTIONS
public void actionPerformed(ActionEvent ae)
{
for(int i=0; i<=11; i++)
{
if(ae.getSource() ==
btn[i])
{
if(calculated)
{
txtFld.setText("");
calculated = false;
}
if(ae.getSource() == btn[11]
&& txtFld.getText().indexOf(".") > -1)
break;
if(checkLength())
txtFld.setText(txtFld.getText()+btn[i].getText());
break;
}
}
if(ae.getSource() == btn[12])
multiplyNumber(false);
else if(ae.getSource() == btn[13])
divideNumber(false);
else if(ae.getSource() == btn[14])
subtractNumber();
else if(ae.getSource() == btn[15])
addNumber();
else if(ae.getSource() == btn[19])
equals();
else if(ae.getSource() == btn[16])
cancel();
else if(ae.getSource() == btn[17])
clearAll();
else if(ae.getSource() == btn[18])
clearList();
setTheFocus();
}
public void itemStateChanged(ItemEvent ie){}
public void
keyTyped(KeyEvent kb){}
public void keyPressed(KeyEvent
kb){}
public void keyReleased(KeyEvent kb){}
public void
focusGained(FocusEvent fe){}
public void focusLost(FocusEvent
fe){}
//------------------------------------------------MOUSE
ACTIONS
public void mouseClicked(MouseEvent me)
{
for(int i=0; i<radioBtn.length;
i++)
{
if(me.getSource() ==
radioBtn[i])
{
radioBtn[i].setSelected(true);
decimalPlaces =
i;
setDecimalPlaces();
clearAll();
break;
}
}
setTheFocus();
}
public void mousePressed(MouseEvent me)
{
setTheFocus();
}
public void mouseReleased(MouseEvent me)
{
setTheFocus();
}
public void mouseEntered(MouseEvent me){}
public void
mouseExited(MouseEvent
me){}
//-----------------------------------------------------------------------
private void
buildGUI()
//BUILD THE GUI
{
Container cp =
getContentPane();
cp.setLayout(new BorderLayout());
Panel leftPanel = new
Panel(); //ADD
JLIST/SCOLLPANE
leftPanel.addMouseListener(this);
list = new
JList();
list.setFont(new Font("Courier
New",Font.PLAIN,12));
list.addMouseListener(this);
myListModel = new
DefaultListModel();
list.setVisibleRowCount(14);
listScroll = new JScrollPane
(list);
leftPanel.add(listScroll);
cp.add(leftPanel,BorderLayout.WEST);
Panel rightPanel = new Panel();
rightPanel.setLayout(new BorderLayout());
rightPanel.addMouseListener(this);
txtFld = new
JTextField("0.00");
//ADD TEXTFIELD
txtFld.setHorizontalAlignment(JTextField.RIGHT);
txtFld.setFont(new Font("Helvetica",Font.BOLD, 30));
txtFld.addKeyListener(this);
txtFld.addKeyListener(new
KeyAdapter()
{
public
void keyTyped(KeyEvent ke)
{
char keyChar =
ke.getKeyChar();
if(!
validKey(keyChar)) ke.consume();
}
});
txtFld.addFocusListener(this);
txtFld.addMouseListener(this);
txtFld.hasFocus();
rightPanel.add(txtFld,BorderLayout.NORTH);
radioGrp = new
ButtonGroup();
//ADD OPTIONBUTTONS
Panel decimals = new
Panel();
decimals.setLayout(new
FlowLayout());
decimals.addMouseListener(this);
for(int i=0; i<
radioBtn.length; i++)
{
radioBtn[i] = new JRadioButton();
radioBtn[i].addItemListener(this);
radioBtn[i].addMouseListener(this);
radioGrp.add(radioBtn[i]);
radioLbl[i] = new
JLabel(String.valueOf(i));
}
radioBtn[2].setSelected(true);
radioLbl[6] = new
JLabel("Decimals ");
decimals.add(radioLbl[6]);
for(int i = 0; i <
radioBtn.length; i++)
{
decimals.add(radioLbl[i]);
decimals.add(radioBtn[i]);
}
rightPanel.add(decimals,BorderLayout.CENTER);
Panel numPad = new
Panel();
//ADD KEYPAD
numPad.setLayout(new
GridLayout(5,4));
for(int i = 0; i < btn.length;
i++)
{
btn[i] = new
JButton();
btn[i].addActionListener(this);
btn[i].setFont(new Font("Serif",Font.BOLD,
18));
if(i<10)
btn[i].setText(String.valueOf(i));
else if(i
== 10) btn[i].setText("00");
else if(i == 11)
btn[i].setText(".");
else if(i == 12)
btn[i].setText("x");
else if(i == 13)
btn[i].setText("÷");
else if(i == 14)
btn[i].setText("-");
else if(i == 15)
btn[i].setText("+");
else if(i == 16)
btn[i].setText("Cancel");
else if(i == 17)
btn[i].setText("Clr All");
else if(i == 18)
btn[i].setText("CIr List");
else if(i == 19)
btn[i].setText("=");
}
btn[12].setFont(new Font("Serif",Font.PLAIN, 18));
btn[16].setFont(new Font("Serif",Font.BOLD, 11));
btn[17].setFont(new Font("Serif",Font.BOLD, 11));
btn[18].setFont(new Font("Serif",Font.BOLD, 11));
btn[16].setMnemonic(KeyEvent.VK_C);
btn[17].setMnemonic(KeyEvent.VK_A);
btn[18].setMnemonic(KeyEvent.VK_L);
numPad.add(btn[16]);
numPad.add(btn[17]);
numPad.add(btn[18]);
numPad.add(btn[12]);
numPad.add(btn[7]);
numPad.add(btn[8]);
numPad.add(btn[9]);
numPad.add(btn[13]);
numPad.add(btn[4]);
numPad.add(btn[5]);
numPad.add(btn[6]);
numPad.add(btn[14]);
numPad.add(btn[1]);
numPad.add(btn[2]);
numPad.add(btn[3]);
numPad.add(btn[15]);
numPad.add(btn[0]);
numPad.add(btn[10]);
numPad.add(btn[11]);
numPad.add(btn[19]);
rightPanel.add(numPad,BorderLayout.SOUTH);
cp.add(rightPanel,BorderLayout.EAST);
setContentPane(cp);
}
public void setVisible(boolean visible) //CENTER
SCREEN
{
if(visible)
{
Dimension dim =
Toolkit.getDefaultToolkit().getScreenSize();
setLocation((dim.width - getWidth())/2, (dim.height -
getHeight())/2);
}
super.setVisible(visible);
}
}
back
top
main page
vb snippets page
java snippets page
vbscript snippets page
email
Page last modified