CPSC 120 Lab 12
Graphical User Interfaces

Lab Objectives

  • Explore how GUIs can be used for user interaction.
  • Gain experience with creating windows with panels.
  • Experience using buttons and text fields.

As usual, create a lab12 subdirectory for today's lab, open up Mozilla Firefox and the Web version of this handout, and open Eclipse.

Vote Counter - Using Buttons

The files VoteCounter.java and VoteCounterPanel.java contain a slightly modified version of the PushCounter program in Listings 6.1 & 6.2 of the text (pages 240-242). VoteCounterPanel.java is the same as in pre-lab. Recall that the program counts the number of times the button is pushed; it assumes ("pretends") each push is a vote for Blue.

  1. Save the files to your directory, then compile the program and run it to see how it works. Resize the window to see the effect on the components.

  2. In a terminal window use the ls command to see the files you have. In addition to the java source code files you should see 3 bytecode files: VoteCounter.class, VoteCounterPanel.class, and VoteCounterPanel$VoteButtonListener.class. The latter is the bytecode for the VoteButtonListener class that is nested inside the VoteCounterPanel class.

  3. Modify the program so that there are two candidates to vote for -- Blue and Red. To do this you need to do the following (most of this you did on paper in pre-lab):
    1. Add instance variables for Red -- a vote counter, a button, and a label. Initialize these variables in the constructor for the panel.
    2. Add the button and label for Red to the panel.
    3. Add the VoteButtonListener object voteListener to the button using the addActionListener method.
    4. Modify the actionPerformed method in the VoteButtonListener class so it checks to see which button generated the event (that is, which button was pushed) and then updates the appropriate counter and displays the results. To do this you need to use the getSource method for event objects. The event object is passed as a parameter to the actionPerformed method (the formal parameter name of the ActionEvent object is event). The getSource method returns a reference to the component that generated the event so you can compare it to your components as in the example on page 247 (explanation beginning on 245).

  4. Compile and run the program.

  5. Adding Some Color Modify the panel so that its color is blue if the Blue button is ahead in the number of "votes" and red if Red is ahead and magenta if it is a tie. Do the following:
    1. In actionPerformed, after the count has been updated and displayed, add a statement to set the background color of the panel based on who is ahead. All Java components have a method:

      void setBackground (Color color)

      that changes thebackground color
    2. Also, change the color of the labels so they clearly show up -- use different colors to go with each background (you can choose the colors). Components have a setForeground method that is analogous to the setBackground method. The setForeground method changes the color of the text in labels and in buttons.
    3. Compile and test your program. Be sure your colors look good and that the labels are visible. If you wish you can also change the foreground and/or background colors of the buttons.

Using TextFields - Computing Body Mass Index

The files Fahrenheit.java and FahrenheitPanel.java contain the example program in Listings 6.5 & 6.6 of the text (pages 249 - 251). The program converts temperatures in Fahrenheit to the Celsius equivalent. The user enters a temperature in the text field and when ENTER is pressed the Celsius equivalent is computed and displayed. Pressing ENTER on a text field generates an action event so the program must implement the ActionListener interface. Do the following:

In this exercise you will write a similar program to compute a person's Body Mass Index. Body Mass Index (BMI) is a measure of weight that takes height into account. Generally, a BMI above 25 is considered high, that is, likely to indicate that an individual is overweight. BMI is calculated as follows for both men and women:

           (703 * weight in pounds) / (height in inches)2

  1. File BMI.java contains the main program that creates the frame for the GUI panel and adds the panel to the content pane of the frame. The file BMIPanel.java contains a skeleton for the GUI to calculate BMI. Since there are two input values needed (the height and weight) this program will not respond to the user pressing ENTER on a text field. Instead, we will put a button on the panel for the user to press to trigger the calculation. So, the user enters his or her height and weight and presses a "Calculate BMI" button; the program then displays the user's BMI. Much of the framework has been done for you, but you will need to fill in code. Do the following (follow the instructions and the comments in the program):

    In the constructor for the panel you need to do the following (put your code for each immediately after the corresponding comment in the code):

    In the actionPerformed method of BMIListener:

    Compile the BMI program and run it.

  2. Add code to the BMIPanel to let the user have some idea of what their BMI means. You need to either modify the JLabel that displays the BMI or add a new JLabel. Your program should include a message based on the following: a BMI less than 19 indicates the person is underweight, a BMI between 19 and 25 (inclusive) means a healthy weight, a BMI between 26 and 30 (inclusive) indicates the person is overweight, and a BMI over 30 indicates the person is very overweight. NOTE: Use an if to choose the appropriate message.

A GUI-based ATM Machine

In this exercise you will create a simple GUI-based ATM machine using the Account class from lab 11. You will need the following files: Account.java, the bank account class; ATM.java, the main program for the GUI; ATMPanel.java, the GUI panel. Open ATMPanel.java in Eclipse and do the following:
  1. Create the components and listeners as instructed by the comments in the program. Be sure to add the components to the panel in the order specified in the comments. (Note: Don't add code to actionPerformed yet - we'll get the GUI looking ok first.)

  2. Compile and run the program to see what it looks like. Not too pretty! This is what the default flow layout looks like.

  3. There are many ways to make things look better. The one we will use is nested panels in the default Layout. The stoplight example we did in class uses this approach. To see what that GUI looks like download the files Stoplight.java which contains the program for the main frame and StoplightPanel.java which contains the panel (you should have the printout of that code from class). Run Stoplight.java and compare what you see to the code in StoplightPanel.java. See what happens when the buttons are clicked (not very interesting, sorry!!!).

    For the ATM GUI we will divide the panel into 4 subpanels (and specify the size of each), then add those to the main panel (whose size needs to be specified). Do this as follows:

    1. Declare and instantiate a JPanel named welcomePanel. Set its size (the width should be the constant WIDTH - you choose an appropriate height). Change the statement that adds the welcome label to the main panel to instead add the label to the welcome panel.
    2. Declare and instantiate a JPanel named amtPanel. Set its size and change the statements that add the label and text field to the main panel so they now add them to the amount panel.
    3. Similarly declare and instantiate a JPanel, appropriately sized, containing the label with "deposit or withdraw" instructions and the two buttons. As above add these components to your new panel instead of to the main panel.
    4. Finally declare and instantiate a JPanel, appropriately sized, containing the balance label. Add the label to this panel.
    5. Now add the four subpanels to the main panel.
    6. Set the size of the main panel using the constants WIDTH and HEIGHT.
    7. Compile and run the program to see how it looks. Make necessary modifications, including setting colors for the panels, to make things look good.

  4. Implement the actionPerformed method in the ChoiceListener class. The method should get the amount from the text field and convert it to a double using the parseDouble method (a static method) in the Double class. Then the method needs to see which button was clicked and, using methods from the Account class, perform the appropriate action (deposit or withdraw). Finally use the setText method to update the balance label (remember to use the formatter object fmt to format the new balance).

HAND IN

Hand in printouts for VoteCounterPanel.java, BMIPanel.java, and ATMPanel.java. Tar your directory and email the tar file to your instructor with a subject of cpsc120 lab12