| 
| 1. Simple calculator | |
| 2. Colour Chooser (Swing example) | 
Design and develop a simple calculator Java program on the lines illustrated on COMP101 but using a GUI instead of a command line interface.
Bote: do soultion presented is founded on a similar example presented in Holmes 1998.
Two callses a Calculator class and an application class (CalculatorApp).
1. Calculator constructor to create an instance of the class Calculator. Includes a window listener to close the wondow with. A panel in which the various keyboard button are contained and a set of buttons. The buttons are set up using a field (keys) compriseing an array of strings with each strinf representing the label for the button. The buttons are set up using a for loop.
2. A set of window event handlers.
3. actionPerformed method invoked when a keypad button is pressed. Includes calls to testForDigit, testForOperator and doCalculation.
4. testForDigit and testForOperator.
5. doCalculation. Includes try-catch to handle divide by zero error.
1. main
   
The code to implement the above is given in Table 1.
// CALCULATOR EXAMPLE PROGRAM
// Frans Coenen
// Friday 1st September 2000
// Dept. of Comp. Sci., University of Liverpool
import java.awt.event.*;
import java.awt.*;
class Calculator extends Frame implements ActionListener, WindowListener {
    // ----------------------- FIELDS --------------------------
    
    private TextField display = new TextField(10);
    private Button[] button = new Button[15];
    
    static String[] keys = {" 0 "," 1 "," 2 "," 3 "," 4 "," 5 "," 6 ",
    		" 7 "," 8 "," 9 "," + "," - "," = "," * "," / "};
    private StringBuffer registerA = new StringBuffer();
    private StringBuffer registerB = new StringBuffer();		
    
    private char operator;
    private boolean firstNumberAlreadyInput = false;
     
    // --------------------- CONSTRUCTORS ----------------------
    
    public Calculator(String text) {
        super(text);
        setBackground(Color.yellow);
        addWindowListener(this);
        
        // Set up display
	
        setLayout(new FlowLayout(FlowLayout.CENTER));
	add(display);
	Panel keypad = new Panel();
	keypad.setLayout(new GridLayout(5,3));
	
	// Set up Keypad
	
	for (int index=0;index!=15;index++) {
	    button[index] = new Button(keys[index]);
	    button[index].addActionListener(this);
	    keypad.add(button[index]);
	    }
	add(keypad);
	} 
    // ---------------------- ACTION LISTENERS -------------------
    /* Window Closed */
    
    public void windowClosed(WindowEvent event) {
        }
    /* Window Deiconified */
    
    public void windowDeiconified(WindowEvent event) {
        }
    /* Window  Iconified */
    
    public void windowIconified(WindowEvent event) {
        }
    /* Window Activated */
    
    public void windowActivated(WindowEvent event) {
        }
    /* Window Deactivated */
    
    public void windowDeactivated(WindowEvent event) {
        }
    /* Window Opened */
    
    public void windowOpened(WindowEvent event) {
        }
    /* Window Closing */
    
    public void windowClosing(WindowEvent event) {
        System.exit(0);
        } 
    
    /* Action Performed: Method to detect which key has been pressed */
    
    public void actionPerformed(ActionEvent event) {
        final int positionOfEqualsKey = 12;
        Object source = event.getActionCommand();
       
        if (testForDigit(source)) return;
	else {
	    if (testForOperator(source)) return;
	    else {
	        display.setText(doCalculation());
		registerA.setLength(0);
		registerB.setLength(0);
		firstNumberAlreadyInput = false;
		}
            }
	}
    // ---------------------- METHODS -----------------------------
    
    /* Test for digit: test for digit in the range 0-9 */
    
    private boolean testForDigit(Object source) {	
        
	for (int digit=0;digit<10;digit++) {
	    if (source.equals(keys[digit])) { 	// Found digit
	        if (firstNumberAlreadyInput) {
		    registerB.append(String.valueOf(digit));
		    display.setText(registerB.toString());
		    }
		else {
		    registerA.append(String.valueOf(digit));
		    display.setText(registerA.toString());
		    }
		return(true);
		}	
	    }
	
	return(false);
	}
    /* Test for operator: */
    
    private boolean testForOperator(Object source) {
        for (int digit=10;digit<15;digit++) {
	    if (source.equals(keys[digit]) && (digit != 12)) {
	        operator = keys[digit].charAt(1);
	        firstNumberAlreadyInput = true;
		return(true);	
		}
	    }
	
	return(false);    
	}
    /* Do calculation: Includes divide by zero error test. */
    
    private String doCalculation() {
        final char beep = '\u0007';
	
	try {
	    int numA = new Integer(registerA.toString()).intValue();
	    int numB = new Integer(registerB.toString()).intValue();
	    
	    switch(operator) {
	        case '+':
		    return String.valueOf(numA+numB);
		case '-':
		    return String.valueOf(numA-numB);
		case '*':
		    return String.valueOf(numA*numB);
		default:
		    return String.valueOf(numA/numB);        
		}
	    }
	catch (ArithmeticException error) {
	    System.out.print(beep);
	    return "   E R R O R";
	    }
	}
    }
/* --------------------------------------------------------------- */
/*                                                                 */
/*                          CALCULATOR APP                         */
/*                                                                 */
/* --------------------------------------------------------------- */
    
class CalculatorApp {
    
    /* Main  method */    
    
    public static void main(String[] args) {
        Calculator screen = new Calculator("Calc.");
        
        screen.setSize(150,200);
        screen.setVisible(true);
        }
    } 
 | 
Table 1:Calculator program
The resulting GUI is shown in Figure 1.
Figure 1: Result of exacuting code presented in Table 1.
The example (based on an Applet in Morelli 2003) in Table 2 and 3 combines a canvas with some other features and includes elements from the BorderFactory class. Note that we first create our own isntance of the Canvas class (Table 3).
// COLOUR CHOOSER
// FRANS COENEN
// TUESDAY 1 July 2003
// THE UNIVERSITY OF LIVERPOOL
/* Based on a similar example by R.Morelli (2003), "Java, Java, Java",
2nd Edition, Prentice Hall. */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ColourChooser extends JFrame implements ActionListener {
    /* FIELDS */
    /* GUI Components */
    private JTextField redIn, greenIn, blueIn;
    private JLabel R = new JLabel("R"),
    	           G = new JLabel("G"),
    	           B = new JLabel("B");
    private JPanel controls = new JPanel();
    private Canvas canvas   = new Canvas();
    /* CONASTRUCTOR */
    public ColourChooser(String s1) {
        super(s1);
        // Set layput
        Container container = getContentPane();
        container.setBackground(Color.white);
        container.setLayout(new BorderLayout(5,5));
        // Control panel
        initControls();
        container.add(controls,"North");
        // Canvas
        container.add(canvas,"Center");
        canvas.setBorder(BorderFactory.createTitledBorder("The Color Display"));
        setSize(40+40+30+40+30+40+40,220);
        setVisible(true);
        }
    /* METHODS */
    /* INITIALISE CONTROLS */
    private void initControls() {
        redIn   = new JTextField("128",4);
        greenIn = new JTextField("128",4);
        blueIn  = new JTextField("128",4);
        // Add listeners
        redIn.addActionListener(this);
        greenIn.addActionListener(this);
        blueIn.addActionListener(this);
        // Layout
        controls.setLayout(new FlowLayout());
        controls.setBorder(BorderFactory.createTitledBorder("Enter values for RGB"));
        controls.add(R);
        controls.add(redIn);
        controls.add(G);
        controls.add(greenIn);
        controls.add(B);
        controls.add(blueIn);
        }
    /* ACTION LISTENER */
    public void actionPerformed(ActionEvent e) {
        int r = Integer.parseInt(redIn.getText());
        int g = Integer.parseInt(greenIn.getText());
        int b = Integer.parseInt(blueIn.getText());
        canvas.setColor(new Color(r,g,b));
        repaint();
        }
    /* MAIN */
    public static void main(String args[]) {
        ColourChooser application = new ColourChooser("Colour Chooser");
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
 | 
Table 1:Colour chooser program
// CANVAS FOR COLOUR CHOOSER
// Frans Coenen
// University of Liverpool
// 27 June 2003
import java.awt.*;
// Java extension packages
import javax.swing.*;
public class Canvas extends JPanel {
    /* FIELDS */
    // Reference points
    private final int HREF = 40, VREF = 55;
    // Reference points
    private final int WIDTH = 40, HEIGHT = 50;
    // Spacing constants
    private final int HGAP = 70, VGAP = 60;
    private Color color = Color.gray;
    /* CONSTRUCTOR */
    /* Default */
    /* METHODS */
    public void setColor(Color c) {
        color = c;
        }
    /* MAIN METHOD */
    public void paintComponent(Graphics g) {
        // Make the panel opaque
        super.paintComponent(g);
        // Draw coloured rectangle
        g.setColor(color);
        g.drawString(color.toString(),10,VREF-15);
        g.drawString("colourr",HREF,VREF+VGAP);
        g.fillRect(HREF,VREF,WIDTH,HEIGHT);
        // Brighten the colouur
        g.setColor(color.brighter());
        g.drawString("brighter",HREF+HGAP,VREF+VGAP);
        g.fillRect(HREF+HGAP,VREF,WIDTH,HEIGHT);
        // Darken the colouur
        g.setColor(color.darker());
        g.drawString("darker",HREF+HGAP+HGAP,VREF+VGAP);
        g.fillRect(HREF+HGAP+HGAP,VREF,WIDTH,HEIGHT);
        }
   }
 | 
Table 1:Colour chooser program
The resulting GUI is shown in Figure 2.
Figure 2: Result of exacuting code presented in Tables 2 and 3.
Created and maintained by Frans Coenen. Last updated 23 August 2005