在窗口中有两个不同颜色的方块,向右以不同速度移动
这里只使用一个线程达到两个方块都移动的目的,在第一方块的纵坐标赋值的时候,采用了随机赋值的random,并不影响程序。
package chapter12;
import java.awt.Color;
import java.util.Random;
import javax.swing.Jframe;
import javax.swing.JPanel;
class Raceframe extends Jframe {
private JPanel tortoise;
private JPanel rabbit;
public Raceframe() {
tortoise = new JPanel();
tortoise.setBounds(0, 50, 30, 30);
tortoise.setBackground(Color.GREEN);
add(tortoise);
rabbit = new JPanel();
rabbit.setBounds(0, 100, 30, 30);
rabbit.setBackground(Color.RED);
add(rabbit);
setTitle("Race frame");
setSize(600, 500);
setLocationRelativeTo(null);
setLayout(null);
setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
setVisible(true);
new TortoiseThread().start();
new RabbitThread().start();
}
private class TortoiseThread extends Thread {
Random random = new Random();
@Override
public void run() {
while(true) {
if(getContentPane().getBounds().contains(getLocation())){
// 随机产生一个值
int step = random.nextInt(100);
tortoise.setLocation(tortoise.getX() + 10, step);
} else {
break;
}
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private class RabbitThread extends Thread {
@Override
public void run() {
while(true) {
rabbit.setLocation(rabbit.getX() + 20, rabbit.getY());
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class ThreadTestDemo {
public static void main(String[] args) {
Raceframe raceframe = new Raceframe();
}
}



