http://stackoverflow.com/questions/29476468/difference-between-canvas-and-jpanel
public void paint(Graphics g) {
g.clearRect(0, 0, width, height);
}
public void update(Graphics g) {
g.clearRect(0, 0, width, height);
paint(g);
}
if (isVisible() && (this.peer != null) &&(width > 0) && (height > 0)) {
PaintEvent e = new PaintEvent(this, PaintEvent.UPDATE,
new Rectangle(x, y, width, height));
Toolkit.getEventQueue().postEvent(e);
}
class Roll extends Thread {
@Override
public void run() {
while (true) {
//创建粒子
createGrain();
//移动粒子
moveGrain();
//重绘粒子
canvas.repaint();
}
}
}
public void repaint() {
Graphics g = this.getGraphics();
update(g);
}
package test;
import java.awt.Graphics;
public class CanvasTest {
final int CREATE_GRAIN_NUMBER = 5000;
JFrame frame;
WorldCanvas canvas;
List grains;
/**
* @wbp.parser.entryPoint
*/
public CanvasTest() {
init();
Graphics g = canvas.getGraphics();
g.fillOval(20, 20, 20, 20);
canvas.paint(g);
}
public void init() {
grains = new ArrayList();
frame = new JFrame();
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.NORTH);
JButton startBtn = new JButton("开始");
panel.add(startBtn);
startBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
new Roll().start();
}
});
canvas = new WorldCanvas();
canvas.setGrains(grains);
frame.getContentPane().add(canvas);
frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void createGrain() {
for (int i = 0; i < CREATE_GRAIN_NUMBER; i++) {
grains.add(new Grain());
}
}
private void moveGrain() {
Grain grain;
for (int i = 0; i < grains.size(); i++) {
grain = grains.get(i);
grain.move();
if (grain.isDead()) {
grains.remove(i);
}
}
}
class Roll extends Thread {
@Override
public void run() {
while (true) {
createGrain();
moveGrain();
canvas.repaint();
}
}
}
public static void main(String args[]) {
new CanvasTest();
}
}
package test;
public class Grain{
private final int SPEED_X = 1;
private final int SPEED_Y = 1;
private final int MAX_X = 300;
private final int MAX_Y = 300;
private int pos_x;
private int pos_y;
private int radius = 5;
private int time = 1;
private boolean isDead = false;
public Grain() {
pos_x = generateRandom(0, 350);
pos_y = generateRandom(0, 350);
}
/*
* (non-Javadoc)
*
* @see test.IGrain#move()
*/
public void move() {
pos_x = pos_x + SPEED_X * time;
pos_y = pos_y + SPEED_Y * time;
if (pos_x > MAX_X || pos_y > MAX_Y) {
setDead(true);
}
}
private int generateRandom(int min, int max) {
int random = (int) (Math.random() * (max - min)) + min;
return random;
}
public int getPos_x() {
return pos_x;
}
public void setPos_x(int pos_x) {
this.pos_x = pos_x;
}
public int getPos_y() {
return pos_y;
}
public void setPos_y(int pos_y) {
this.pos_y = pos_y;
}
public boolean isDead() {
return isDead;
}
private void setDead(boolean b) {
isDead = true;
}
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
}
package test;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.util.List;
public class WorldCanvas extends Canvas {
/**
*
*/
private static final long serialVersionUID = 1L;
private List grains;
// public void update(Graphics g) {
// g.clearRect(0, 0, 350, 350);
// super.update(g);
// }
@Override
public void repaint() {
Graphics g = this.getGraphics();
update(g);
}
@Override
public void paint(Graphics g) {
g.setColor(Color.blue);
for (Grain grain : grains) {
g.fillOval(grain.getPos_x(), grain.getPos_y(), grain.getRadius(),
grain.getRadius());
}
}
public List getGrains() {
return grains;
}
public void setGrains(List grains) {
this.grains = grains;
}
}