Computer Science 15-110, Fall 2009
Class Notes: Getting Started with Events
Getting Started with Events
// BeepingDemo.java // Demonstrates the timerFired event in JComponentWithEvents.
// To compile and run this Java file, you must: // 1. Download current JComponentsWithEvents.class file from here: // http://www.kosbie.net/cmu/JComponentWithEvents/ // and place it in the same directory as your Java program. // 2. Include a main method that calls the "launch" method // defined in JComponentWithEvents (see below).
import javax.swing.*; import java.awt.*;
class BeepingDemo extends JComponentWithEvents { // This method is called at regular intervals by the timer. public void timerFired() { beep(); }
public void paint(Graphics2D page) {
page.fillRect(50, 50, 50, 50);
}
// Standard main method:
public static void main(String[] args) { launch(500, 400); }
}
// AnimationDemo.java // Demonstrates the timerFired event in JComponentWithEvents, // and using an instance variable to retain data between method calls // (to the event handlers and the paint method).
import javax.swing.*; import java.awt.*;
class AnimationDemo extends JComponentWithEvents {
// this instance variable persists between method calls! private int rectX = 50;
public void timerFired() {
rectX += 5;
}
public void paint(Graphics2D page) {
page.fillRect(rectX, 50, 50, 50);
}
// Standard main method:
public static void main(String[] args) { launch(500, 400); }
}
// Add this method to your Animation program // This method is called exactly once at the start of the program. public void start() { int delayInMilliseconds = 1; setTimerDelay(delayInMilliseconds); }
// MousePressedDemo.java // Demonstrates the mousePressed event in JComponentWithEvents.
import javax.swing.*; import java.awt.*;
class MousePressedDemo extends JComponentWithEvents {
// these instance variables persists between method calls! private int rectX = 50; private int rectY = 50;
// This method is called each time the mouse is pressed. // The parameters contain the (x,y) location of the mouse press. public void mousePressed(int x, int y) { rectX = x; rectY = y; }
public void paint(Graphics2D page) {
page.fillRect(rectX, rectY, 50, 50);
}
// Standard main method:
public static void main(String[] args) { launch(500, 400); }
}
// KeyPressedDemo.java // Demonstrates the mousePressed event in JComponentWithEvents.
import javax.swing.*; import java.awt.*;
class KeyPressedDemo extends JComponentWithEvents {
// these instance variables persists between method calls! private int rectX = 50; private int rectY = 50;
// This method is called each time a key is pressed. // The parameter contains the key that was pressed. // Note that you can use the constants UP, DOWN, LEFT, and RIGHT // to represent the arrow keys. public void keyPressed(char key) { if (key == RIGHT) rectX += 10; else if (key == 'l') // We'll take 'l' to mean "left" edge of the window rectX = 0; }
public void paint(Graphics2D page) {
page.fillRect(rectX, rectY, 50, 50);
}
// Standard main method:
public static void main(String[] args) { launch(500, 400); }
}
// This demo shows how to pause and unpause an
// animation using the 'p' key
import javax.swing.*;
import java.awt.*;
class PausingDemo extends JComponentWithEvents {
private boolean isPaused = false;
private int counter = 0;
public void timerFired() {
if (isPaused == true)
// if we are paused, do nothing, just return immediately!
return;
beep();
counter++;
}
public void keyPressed(char key) {
if (key == 'p')
// turn on or off pausing with the 'p' key
isPaused = !isPaused;
}
public void paint(Graphics2D page) {
page.setFont(new Font("Arial", Font.BOLD, 16));
page.drawString("Pause/unpause beeping with 'p' key", 50, 50);
page.drawString("Calls to timerFired: " + counter, 50, 100);
}
public static void main(String[] args) { launch(400, 150);}
}
// This demo shows how to simulate timer events
// using the 't' key while an animation is paused
// (using the 'p' key to pause and unpause).
// This is VERY helpful for debugging!
// To fully understand this code, compare it to the
// previous example. In particular, be sure to understand
// why we wrote the onTimerFired helper method.
import javax.swing.*;
import java.awt.*;
class SimulatedTimerEventsDemo extends JComponentWithEvents {
private boolean isPaused = false;
private int counter = 0;
// This helper method is called by timerFired when it is not
// paused, and also by keyPressed to simulate a timerEvent.
public void onTimerFired() {
beep();
counter++;
}
public void timerFired() {
if (isPaused == true)
// if we are paused, do nothing, just return immediately!
return;
onTimerFired();
}
public void keyPressed(char key) {
if (key == 'p')
// turn on or off pausing with the 'p' key
isPaused = !isPaused;
else if (key == 't')
// simulate a timer fired event when user presses 't'
onTimerFired();
}
public void paint(Graphics2D page) {
page.setFont(new Font("Arial", Font.BOLD, 16));
page.drawString("Pause/unpause beeping with 'p' key", 50, 50);
page.drawString("Paused = " + isPaused, 50, 100);
page.drawString("Calls to timerFired: " + counter, 50, 150);
}
public static void main(String[] args) { launch(400, 200);}
}
import javax.swing.*;
import java.awt.*;
class MyGraphics extends JComponentWithEvents {
private int rectX = 0;
public void timerFired() {
rectX += 30;
}
public void paint(Graphics2D page) {
// This is meant to "wraparound" the rectangle.
// The code is correct, but it's in the wrong place.
// It belongs in the timerFired method, not here!!!
if (rectX > getWidth()-200)
rectX = 0; // this line, in particular, is the problem!
page.fillRect(rectX, 50, 200, 50);
}
public static void main(String[] args) { launch(500, 300);}
}
Works briefly, then generates this output:

Rules:
* Paint methods only GET instance variables.
* Event handlers (timerFired, keyPressed, mousePressed) can GET OR SET
instance variables.
carpe diem - carpe diem - carpe diem - carpe diem - carpe diem - carpe diem - carpe diem - carpe diem - carpe diem