CPSC 170 Lab 5
Events, Interfaces and Polymorphism
As usual, create a lab5 subdirectory for today's lab, open this
document in FireFox, and start emacs.
Thinking about Events
Throughout this class, we have been working with
event-based programming. The general idea is that things can happen
during the execution of the program that we wish to respond to. To capture
these events , we establish listeners . A listener is simply
a block of code that is executed when a certain event occurs. For example, to
respond to a button being pushed, we define an ActionListener. Since we
want to respond to different events in different ways, we would like to
extend the capabilities of the ActionListener to suit our needs.
However! ActionListeners only do one thing - respond to an
"actionPerformed". Moreover, since we are always going to specify what to
do in case there was an "actionPerformed", the actionListener is actually
abstract!
So, we have an abstract class, where all methods are abstract -
this is a good candidate for an interface! Therefore, when we
define a class to respond to events, we don't extend ActionListener,
we ___________________________________ ActionListener.
Timers
We typically think of events as being something that the user has done,
i.e. clicking on a button, but that is not always the case.
We might also be interested in generating events at regular intervals. For
example, we might want a program that checks for new e-mail every 15 minutes.
To acheive this, we use a Timer object to generate events for us.
A timer object has an interval,
measured in milliseconds, and a listener that defines the code to be executed
after the interval of time has elapsed. (see page 470-474 or JavaDoc
for more details)
Download the file drawBars.tgz . Uncompress it using
the command
tar xzf drawBars.tgz
This should containt three files: bars.java, BarsPanel.java and drawBars.java
Compile drawBars.java and run the file. Observe what
it does (be patient, there is a timer in there!)
You should have noticed that the bars changed color, one by one -- if you
didn't know better, you would expect that there was a for loop or a while loop
controlling the color change. Examine the code to find out what is really
going on.
Before you move on, you should make sure that you understand:
- How much time lapses between color changes?
- How does the timer know which bar to alter?
- How do we know that all the bars have changed color?
- What does the timer do after all the bars have changed color?
Sorting
Often when we sort, especially small lists, the computer is done before we
know it (and that's a good thing). However, since we are just getting started
with sorting, it is useful to break down the sorting process to allow us
to get a better sense of what is happening.
We are going to sort the bars (according to height), using a selection sort
(refer to the code on p 500).
Instead of doing the entire sort at once, we are going to use the timer to
delay processing and see incremental steps. To achieve this you should:
- Modify bars.java to make it implement Comparable. Remember from class
that a Comparable interface uses one method - compareTo. The semantics
of this method are defined on page 320.
- In BarsPanel.java, create a method:
private int minIndex(int start) -- takes
an index start and returns the index of the
smallest bar in the list starting at index start.
- In BarsPanel.java,Create a method:
private void swap(int i, int j) -- takes
two indices and swaps the values in the list at those indices.
- Modify the refreshListener to implement a selection sort.--
At the conclusion of each timer event, you should see that
one more bar is correctly positioned. To make things easier to follow, you
should also change the color of the corectly positioned bars to blue.
Note - your final code won't be too much different than it does now, right?
Print your work to turn in.
Polymorphism
Consider the game of Monopoly.
The game consists of a sequential set of 40 squares containing
28 properties, 6 Action squares (3 "Chance", 3 "Community Chest"), 2 Tax
squares, "GO", "Jail", "Free Parking", and "Go To Jail.". The game is played
by moving through the set of squares. Every time a player lands of a
square, they take a different action, depending on the type of a square. For
example, if you land on a "Tax Square", you must pay the bank a certain amount
of money, but if you land on an "Action Square" you must draw a card from the
appropriate pile and follow the instructions on the card.
Note that
this is a perfect example of polymorphism. Take a deep breath and
relax, you are not implementing Monopoly during this lab. However you are
going to use polymorphism to describe the gameplay. To accomplish this
you should:
Print your work to turn in.
HAND IN:
- Printouts of your programs - make sure that your name is included in the
header comments (not just written on)
- Tar the files in your lab5 directory with the command
tar czf lab5.tgz .