Transcript CDI Talk2

Applications of Java to
Physics Teaching (Part II)
S S Tong
Department of Physics
CUHK
6. Simple Animations
 Animations
– many frames displayed in a given order
 Thread
– part of the program running on its own
– multi-tasking (actually multi-threading)
 How to
– create a thread?
– display the frames?
– terminate the thread under certain conditions?
 Implement the interface Runnable
 Declare a Thread
public class Spin extends Applet implements
Runnable {
Thread runner = null;
......
}
 Load a series of image
for (int i = 0; i < 16; i++)
spin[i] = getImage(getCodeBase(),
"images/Spin" + i + ".gif");
 Create and run a Thread
runner = new Thread(this);
runner.start();
calls the run() method
 Create a loop, call the paint method repeatedly
public void run() {
int i = 0;
while (runner != null) {
currentImage = spin[i];
repaint();
i++;
if (i > 15) i = 0;
pause(50);
}
}
public void paint(Graphics screen) {
if (currentImage != null) {
screen.drawImage(
currentImage, 100, 100, this);
......
}
}
 Flow of the applet
init() call paint(...)once
images
loaded
...getImage(...)
Thread created and
initialized
...new Thread(this)
runner.start()
run()
loop inside
while (...) {
......
}
 Stop a thread
runner.stop();
runner = null;
paint(...)
repaint()
draw images
 Reduce flickering
– Override the update(...) method, so that the screen
is not erased before repainting
public void update(Graphics screen) {
paint(screen);
call the paint method directly
}
– Create an off-screen image and a Graphics object
• do all drawing on the off-screen image first
• replace the on-screen image with the updated off-screen
image
......
Graphics offScreen;
Image offScreenImage;
public void init() {
offScreenImage = createImage(300,300);
......
 Reduce flickering (contiune)
public void paint(Graphics screen) {
j++;
associate the off-screen image and Graphics
offScreen = offScreenImage.getGraphics();
if (currentImage != null) {
offScreen.setColor(Color.white);
erasing
offScreen.fillRect(0,0,300,300);
off-screen
offScreen.drawImage(currentImage,
drawing
100, 100, this);
off-screen
offScreen.setColor(Color.red);
offScreen.drawString("Frame no " + j,
30, 30);
screen.drawImage(offScreenImage,
0, 0, this);
put the off-screen
}
}
image on-screen
7 Building simple interface
 Basic components
Label
Button
Checkbox
Choice
TextField
 Adding components to an applet
– Declare the object type
Button theButton;
Checkbox theCheckbox;
Choice theChoice;
TextField theField;
– Assign labels and attributes to the components
theButton = new Button("I am a button");
theCheckbox = new Checkbox("I am a checkbox");
theChoice = new Choice();
theChoice.add("I am item 1");
theChoice.add("I am item 2");
theChoice.add("I am item 3");
items
contents
length
theField = new TextField("long field", 20);
– Add the components to the applet
add(...);
 Canvas - an area for drawing
– create a subclass of Canvas
class MyCanvas extends Canvas {
MyCanvas() {
set background color
setBackground(Color.cyan);
setSize(300,300);
set size
}
public void paint(Graphics screen) {
......
draw something on the canvas
}
}
– create an instance of this subclass in the applet
canvas = new MyCanvas();
– repaint the canvas
canvas.repaint();
 How to arrange the components?
– Use Layout Manager
 We discuss the BorderLayout() only
public void init() {
setLayout(new BorderLayout());
......
North
West
Center
South
East
– Adding components
add("South", buttonA);
add("Center", canvasB);
– Using a panel
add("Center",
canvas);
Panel p =
new Panel();
p.add(theLabel);
p.add(theButton);
......
add("South",p)
 Firing events from the components
– Listeners:
ActionListener
for Button
ItemListener for Choice and Checkbox
– Implementing the Listeners
import java.awt.event.*;
public class EventTest extends Applet
implements ActionListener, ItemListener {
......
Listeners are interfaces
– Adding Listeners to the component
button1.addActionListener(this);
theChoice.addItemListener(this);
theCheckbox.addItemListener(this);
– Buttons trigger the actionPerformed method
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == button1) ......
if (evt.getSource() == button2) ......
canvas.repaint();
identify which component
}
triggers the event
– Choice menus and checkboxes trigger
itemStateChanged method
public void itemStateChanged(ItemEvent evt) {
if (evt.getSource() == theChoice) {
int itemNo = theChoice.getSelectedIndex();
get the index of the selected item
.......
if (evt.getSource() == theCheckbox) {
boolean boxState = theCheckbox.getState();
.......
get the state (true/false) of the checkbox
– Updating the canvas
import java.awt.event.*;
........
public class EventTest extends Applet implements
ActionListener, ItemListener {
String currentString = "";
......
public void actionPerformed(ActionEvent evt) {
...... canvas.repaint();
}
public void itemStateChanged(ItemEvent evt) {
...... canvas.repaint();
}
}
class EventCanvas extends Canvas {.......
screen.drawString(currentString, 50, 50);
......
EventCanvas is defined inside EventTest
}
- an inner class
 Number I/O for a TextField
field.getText() gives the text of field
field.setText("string") sets the text of field to "string"
– Converting numbers to strings and vice versa
class MyTextField extends TextField {
call to the
superclass's
constructor
string
 double
double
 string
}
MyTextField(String s, int l) {
super(s,l);
}
double getNumber() {
return Double.valueOf(
getText()).doubleValue();
}
void setNumber(double num) {
setText(String.valueOf(num));
}
 Example AnimateWaves.java
– superposition of two waves
– amplitude, wavelengths, periods read from text fields
– mode of display - choice menu
– start and stop - buttons
 Exercise ProjectileEx.java
– initial position and velocity read from text fields
– start and reset - buttons
 Example ShootHead.java
– Modification of Projectile.java
– Shooting a free-falling object
 Listening to mouse events
– Listeners:
MouseListener
mouse pressed, released, enter, exit
MouseMotionListener
mouse moved, dragged
– Implementing the Listeners
import java.awt.event.*;
public class EventTest extends Applet
implements MouseListener,
MouseMotionListener {
......
Listeners are interfaces
– Adding Listeners to the component
canvas.addMouseListener(this);
canvas.addMouseMotionListener(this);
– Let the canvas listens to mouse events
– Interact with hot spots, drag and drop objects etc.
– Mouse events trigger
public void mousePressed(MouseEvent evt) {...}
public void mouseClicked(MouseEvent evt) {...}
public void mouseReleased(MouseEvent evt) {...}
public void mouseEntered(MouseEvent evt) {...}
public void mouseExited(MouseEvent evt) {...}
– Mouse motion events trigger
public void mouseMoved(MouseEvent evt) {...}
public void mouseDragged(MouseEvent evt) {...}
– Gets the mouse position inside this methods e.g.,
Point p = evt.getPoint();
 Example AddVectors.java
– addition and subtraction of two vectors
– changing the text fields updates the screen
– dragging the vectors updates the text fields
8 References
 L. Lemay and R. Cadenhead, Teach Yourself Java 2 in 21
days, SAMS
 M. Campione and K. Walrath, The Java Tutorial (2nd Ed),
Addison Wesley
 http://java.sun.com/