|
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