7 Multithreading: animation

errorhandleSoftware and s/w Development

Nov 18, 2013 (3 years and 11 months ago)

77 views

Multithreading

:

animation

slide 5.
2

Animation


Animation shows different objects moving
or changing as time progresses.


Thread programming is useful in
animation.


Animation can be achieved by launching
one or more threads that compute how the
objects change.

slide 5.
3

slide 5.
4

slide 5.
5

/**


Example of animation:


a bouncing ball runs in a separate thread

*/


import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

import java.util.*;

import javax.swing.*;


public class BounceThread {


public static void main(String[] args) {


JFrame frame = new BounceFrame();


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


frame.show();


}

}


slide 5.
6

/**


The frame with canvas and buttons.

*/

class BounceFrame extends JFrame {


/**


Constructs the frame with the canvas for showing the


bouncing ball and Start and Close buttons


*/


public BounceFrame() {


setSize(WIDTH, HEIGHT);


setTitle("BounceThread");


Container contentPane = getContentPane();


canvas = new BallCanvas();


contentPane.add(canvas, BorderLayout.CENTER);


JPanel buttonPanel = new JPanel();


addButton(buttonPanel, "Start",


new ActionListener() {


public void actionPerformed(ActionEvent evt) {


addBall();


}


});

slide 5.
7


addButton(buttonPanel, "Close",


new ActionListener() {


public void actionPerformed(ActionEvent evt) {


System.exit(0);


}


});


contentPane.add(buttonPanel, BorderLayout.SOUTH);


}



/**


Adds a button to a container.


@param c the container


@param title the button title


@param listener the action listener for the button


*/


public void addButton(Container c, String title,


ActionListener listener) {


JButton button = new JButton(title);


c.add(button);


button.addActionListener(listener);


}




slide 5.
8


/**


Adds a bouncing ball to the canvas and starts a thread


to make it bounce


*/


public void addBall() {


Ball b = new Ball(canvas);


canvas.add(b);


BallThread thread = new BallThread(b);


thread.start();


}



private BallCanvas canvas;


public static final int WIDTH = 450;


public static final int HEIGHT = 350;

}


slide 5.
9

/**


A thread that animates a bouncing ball.

*/

class BallThread extends Thread {


/**


Constructs the thread.


@aBall the ball to bounce


*/


public BallThread(Ball aBall) { b = aBall; }



public void run() {


try {


for(;;) {


b.move(); sleep(5);


}


}


catch (InterruptedException exception) { }


}


private Ball b;

}


slide 5.
10

/** The canvas that draws the balls.

*/

class BallCanvas extends JPanel {


/**


Add a ball to the canvas.


@param b the ball to add


*/


public void add(Ball b) {


balls.add(b);


}


public void paintComponent(Graphics g) {


super.paintComponent(g);


Graphics2D g2 = (Graphics2D)g;


for (int i = 0; i < balls.size(); i++) {


Ball b = (Ball)balls.get(i);


b.draw(g2);


}


}


private ArrayList balls = new ArrayList();

}


slide 5.
11

/**


A ball that moves and bounces off the edges of a component

*/

class Ball {


/**


Constructs a ball in the upper left corner


@c the component in which the ball bounces


*/


public Ball(Component c) { canvas = c; }



/**


Draws the ball at its current position


@param g2 the graphics context


*/


public void draw(Graphics2D g2) {


g2.setColor(Color.red);


g2.fill(new Ellipse2D.Double(x, y, XSIZE, YSIZE));


}




slide 5.
12


/**


Moves the ball to the next position, reversing direction


if it hits one of the edges


*/


public void move() {


x += dx; y += dy;


if (x < 0) {


x = 0; dx =
-
dx;


}


if (x + XSIZE >= canvas.getWidth()) {


x = canvas.getWidth()
-

XSIZE; dx =
-
dx;


}


if (y < 0) {


y = 0; dy =
-
dy;


}


if (y + YSIZE >= canvas.getHeight()) {


y = canvas.getHeight()
-

YSIZE; dy =
-
dy;


}


canvas.repaint();


}

slide 5.
13




private Component canvas;


private static final int XSIZE = 15;


private static final int YSIZE = 15;


private int x = 0;


private int y = 0;


private int dx = 2;


private int dy = 2;

}