⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bounceexpress.java

📁 "多线程的例子"包括了多线程的各个方面
💻 JAVA
字号:
/**
   @version 1.30 2001-05-06
   @author Cay Horstmann
*/

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;

/**
   Shows animated bouncing balls, some running in higher priority
   threads
*/
public class BounceExpress {
	public static void main(String[] args) {
		JFrame frame = new BounceFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.show();
	}
}

/**
   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("BounceExpress");

		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(Thread.NORM_PRIORITY, Color.black);
			}
		});

		addButton(buttonPanel, "Express", new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				addBall(Thread.NORM_PRIORITY + 2, Color.red);
			}
		});

		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);
	}

	/**
	   Adds a bouncing ball to the canvas and starts a thread
	   to make it bounce
	   @param priority the priority for the threads
	   @color the color for the balls
	*/
	public void addBall(int priority, Color color) {
		Ball b = new Ball(canvas, color);
		canvas.add(b);
		BallThread thread = new BallThread(b);
		thread.setPriority(priority);
		thread.start();
	}

	private BallCanvas canvas;
	public static final int WIDTH = 450;
	public static final int HEIGHT = 350;
}

/**
   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 (int i = 1; i <= 1000; i++) {
				b.move();
				sleep(5);
			}
		} catch (InterruptedException exception) {
		}
	}

	private Ball b;
}

/**
   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();
}

/**
   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
	   @aColor the color of the ball
	*/
	public Ball(Component c, Color aColor) {
		canvas = c;
		color = aColor;
	}

	/**
	   Draws the ball at its current position
	   @param g2 the graphics context
	*/
	public void draw(Graphics2D g2) {
		g2.setColor(color);
		g2.fill(new Ellipse2D.Double(x, y, XSIZE, YSIZE));
	}

	/**
	   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();
	}

	private Component canvas;
	private Color color;
	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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -