Niche: | CS1 or CS2 course |
Assumes: | Fundamental programming skills in Java, including some simple GUI-building. |
Covers: | GUI design and construction, Java Timers and events. |
For this assignment, you will design and implement a Java application that
displays ASCIImations. An ASCIImation is a movie made up of individual
frames, where each frame is a series of text lines containing ASCII-characters. Your
application must be able to read in a movie from a file, with each frame separated by
the divider "=====
". A movie file should be able to end either
with or without a divider. The sample
movies bounce.txt and
pirate.txt are provided as illustrations.
As part of your application, you should define a class that represents an ASCIImation. This class should provide the functionality to read and store a movie, and to produce the frames of the movie one at a time (in sequential order). For our purposes, we will assume that movies always run in a loop, so the first frame in the movie always follows the last.
In addition to your ASCIImation class, you will need to design and build a graphical user interface for displaying the movie. At a minimum, your GUI should allow the user to enter the file name for an ASCIImation, start the movie, and pause the movie. The user should be able to change the ASCIImation and view it without restarting the application. For example, a basic GUI might look like the following:
Note that this is the minimum functionality that your GUI must provide. You are encouraged to explore the Java Swing libraries and implement additional functionality. Ideas might include adding a step button (for stepping one frame at a time), a slider to control the speed of the movie, a check box for turning looping on or off, and a pop-up menu for selecting files. Have fun with it.
In order to display the frames of the movie in sequence, you will probably
want to make use of the java.util.Timer
and java.util.TimerTask
classes. Your GUI class will need to have a field of type Timer
(for scheduling
evenly-spaced threads to draw the frames) and an inner class that extends
TimerTask
to draw a single frame. For example:
private Timer drawTimer; private class DrawAFrameTask extends TimerTask { public void run() { // CODE FOR DRAWING THE NEXT FRAME } }
At the point in the code where you want to start drawing the movie, you will need
to call the schedule
method on your Timer
object to schedule
the drawing tasks. This method takes as parameters a TimerTask
, the number of
milliseconds before the first task is to be executed, and the number of milliseconds
between tasks (denoted here by the constant DELAY
). For example:
drawTimer.schedule(new DrawAFrameTask(), 0, DELAY);
Review the documentation for the Timer
class for additional
functionality, including how to stop the Timer
.
You must demonstrate good programming style when completing this assignment, including the appropriate use of Javadoc-style comments for all classes and methods. As part of this assignment, you must hand in an ASCIImation of your own design and construction. A prize will be awarded to the student with the most creative movie.