import java.util.StringTokenizer;
import java.util.Hashtable;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.applet.Applet;
// Converts the Calculator application to run either as an application
// or as an applet by creating a "shared" panel -- a panel that will
// be shared by the application's Frame and by the Applet. The panel
// will be the first component placed on each. All other components are
// placed on the shared panel.
public class CalculatorE extends Applet {
private boolean isApplet = false;
private boolean lastKeyWasFunction = true;
private double displayHold = 0;
private Frame f;
private Hashtable theKeys = new Hashtable();
private Label display;
private Panel pMain;
private String lastFunction = "";
private Toolkit tk = null;
private KeyListener keyListener = new KeyListener();
public static void main(String[] args) {
CalculatorE calc = new CalculatorE();
calc.isApplet = false;
calc.tk = Toolkit.getDefaultToolkit();
calc.f = new Frame("Calculator");
// add Window closer
calc.f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
// close anon inner class
});
// add Key Listener to frame
calc.f.addKeyListener(calc.keyListener);
// create panel which will be shared by Frame and Applet
calc.pMain = new Panel();
calc.pMain.setLayout(new BorderLayout());
calc.pMain.setBackground(Color.lightGray);
calc.pMain.addKeyListener(calc.keyListener);
// add shared panel to Frame
calc.f.add(calc.pMain, BorderLayout.CENTER);
calc.makeGUI();
}
public void init() {
isApplet = true;
setLayout(new BorderLayout());
setBackground(Color.lightGray);
this.addKeyListener(keyListener);
// create the shared panel
pMain = new Panel();
pMain.setLayout(new BorderLayout());
pMain.setBackground(Color.lightGray);
pMain.addKeyListener(keyListener);
// add the shared panel to the applet
add(pMain, BorderLayout.CENTER);
makeGUI();
}
private void makeGUI() {
// add display
display = new Label("0", Label.RIGHT);
pMain.add(display, BorderLayout.NORTH);
Panel numPanel = new Panel();
numPanel.setBackground(pMain.getBackground());
numPanel.addKeyListener(keyListener);
numPanel.setLayout(new GridLayout(4, 3));
Panel funcPanel = new Panel();
funcPanel.setBackground(numPanel.getBackground());
funcPanel.addKeyListener(keyListener);
funcPanel.setLayout(new GridLayout(4, 2));
// create number buttons
if (true) {
ButtonListener bl = new ButtonListener(0);
for (int i = 0; i < 12; i++) {
Button b = new Button("" + i);
b.setForeground(Color.blue);
b.addActionListener(bl);
b.addKeyListener(keyListener);
// handle blank and '.' buttons
if (i == 10) {
b.setLabel("+/-");
}
if (i == 11) {
b.setLabel(".");
}
theKeys.put(b.getLabel(), b);
}
}
// create function keys
if (true) {
ButtonListener bl = new ButtonListener(1);
StringTokenizer st = new StringTokenizer("/ C * CE + none - =", " ");
while (st.hasMoreTokens()) {
Button b = new Button(st.nextToken());
b.setForeground(Color.red);
b.addActionListener(bl);
b.addKeyListener(keyListener);
// disable unneded 'b' key
if (b.getLabel().equals("none")) {
b.setVisible(false);
}
// add the key to theKeys array
theKeys.put(b.getLabel(), b);
// add the key to the function panel
funcPanel.add(b);
}
}
// place number buttons on numPanel
for (int i = 1; i <= 9; i++) {
numPanel.add((Button)theKeys.get("" + i));
}
numPanel.add((Button)theKeys.get("+/-"));
numPanel.add((Button)theKeys.get("0"));
numPanel.add((Button)theKeys.get("."));
pMain.add(numPanel, BorderLayout.CENTER);
pMain.add(funcPanel, BorderLayout.EAST);
if (!isApplet) {
f.pack();
Dimension screensize = tk.getScreenSize();
// set size
f.setSize(screensize.width / 5, screensize.height / 4);
// center form
f.setLocation((screensize.width - f.getWidth()) / 2,
(screensize.height - f.getHeight()) / 2);
f.setResizable(false);
}
pMain.setVisible(true);
setVisible(true);
if (isApplet == false) {
f.setVisible(true);
}
}
private double getDisplayValue() {
double d = 0.0;
String s = display.getText();
try {
// Double.parseDouble doesn't work in 1.1v applets
d = Double.valueOf(s).doubleValue();
} catch (NumberFormatException e) {
d = 0.0;
}
return d;
}
private void handleFuncKey(Button b) {
String lbl = b.getLabel();
if ("=CCE".indexOf(lbl) > -1) {
if (lbl.equals("C")) {
displayHold = 0d;
lastFunction = "";
display.setText("0");
}
if (lbl.equals("CE")) {
display.setText("0");
lastKeyWasFunction = true;
return;
}
if (lbl.equals("=")) {}
}
if (lastFunction.equals("+")) {
display.setText("" + (displayHold + getDisplayValue()));
}
if (lastFunction.equals("-")) {
display.setText("" + (displayHold - getDisplayValue()));
}
if (lastFunction.equals("*")) {
display.setText("" + (displayHold * getDisplayValue()));
}
if (lastFunction.equals("/")) {
String r;
try {
r = "" + (displayHold / getDisplayValue());
} catch (ArithmeticException ae) {
r = "divison error";
displayHold = 0d;
}
display.setText(r);
}
lastKeyWasFunction = true;
lastFunction = lbl;
displayHold = getDisplayValue();
}
private void handleNumKey(Button b) {
String lbl = b.getLabel();
if (lastKeyWasFunction) {
display.setText("");
}
if (lbl.equals(".") || lbl.equals("+/-")) {
if (lbl.equals(".")) {
if (display.getText().indexOf(".") == -1) {
display.setText(display.getText() + ".");
}
} else {
display.setText("" + getDisplayValue() * -1);
}
} else {
display.setText(display.getText() + lbl);
}
lastKeyWasFunction = false;
}
private class ButtonListener implements ActionListener {
// buttonType == 0 : number key listener
// buttonType == 1 : function key listener
private int listenerType = 0;
ButtonListener(int listenerType) {
this.listenerType = listenerType;
}
public void actionPerformed(ActionEvent e) {
Button b = (Button)e.getSource();
if (listenerType == 0) {
handleNumKey(b);
} else {
handleFuncKey(b);
}
}
}
private class KeyListener extends KeyAdapter {
// better to use Keystroke class, but it's not supported in v1.1
private String lastKey = "";
public void keyPressed(KeyEvent e) {
Button b = null;
String targ = "NUMPAD";
String key = e.getKeyText(e.getKeyCode());
key = key.toUpperCase();
if (key.indexOf(targ) > -1) {
key = key.substring(key.indexOf(targ) + 1 + targ.length());
}
// handle SHIFTed keys
if (lastKey.equals("SHIFT")) {
if (key.equals("8")) {
key = "*";
}
if (key.equals("=")) {
key = "+";
}
}
if (key.equals("ENTER")) {
key = "=";
}
if (key.equals("MINUS")) {
key = "-";
}
b = (Button)theKeys.get(key);
if (b != null) {
if ("0123456789.".indexOf(key) > -1) {
handleNumKey(b);
} else {
handleFuncKey(b);
}
}
lastKey = key;
}
}
}
Samples