本实验的思路,利用button按钮的移动来模仿4×100 接力的效果,采用子线程的方式来修改button的显示位置,程序运行后,按 S 键开始模拟 4 个人移动接力,按下Q,结束。
话不多说,直接上代码:
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
//界面的创建
class lampView extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel panelLamp1 = new JPanel();
private JPanel panelLamp2 = new JPanel();
private JPanel panelLamp3 = new JPanel();
private JPanel panelLamp4 = new JPanel();
public lampView() {
super("线程同步----4*100接力");
Container con = getContentPane();
con.setLayout(null);
//this.SetPosition(new Point(0,100),new Point(130,100),new Point(260,100),new Point(390,100));
con.add(this.lamp1(panelLamp1,Color.blue));
con.add(this.lamp1(panelLamp2,Color.green));
con.add(this.lamp1(panelLamp3,Color.red));
con.add(this.lamp1(panelLamp4,Color.yellow));
JLabel Notice=new JLabel("按 S 开始接力,按 Q 停止接力");
Notice.setLocation(200, 200);
Notice.setSize(200,100);
con.add(Notice);
this.setSize(600, 350);
this.setVisible(true);
this.setLocation(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭软件后,关闭线程
}
//给外部访问修改的数据
public void SetPosition(Point p1,Point p2,Point p3,Point p4) {
this.panelLamp1.setLocation(p1);
this.panelLamp2.setLocation(p2);
this.panelLamp3.setLocation(p3);
this.panelLamp4.setLocation(p4);
//this.validate();
}
// 模拟人的创建
public JPanel lamp1(JPanel panel,Color color) {
Dimension size = new Dimension(30, 30);
JButton lamp1 = new JButton();
panel.setLayout(new FlowLayout());
lamp1.setBackground(color);
lamp1.setPreferredSize(size);
panel.add(lamp1);
panel.setSize(30, 30);
panel.setLocation(0,0);
return panel;
}
}
//线程类
class ThreadLamp extends Thread {
private Point p1, p2, p3, p4;
private boolean SunFlag = true;
lampView lampView = new lampView();
public boolean isSunFlag() {
return SunFlag;
}
public void setSunFlag(boolean sunFlag) {
SunFlag = sunFlag;
}
public ThreadLamp(String name, int meter) {
super(name);
p1 = new Point(0, 100);
p2 = new Point(130, 100);
p3 = new Point(260, 100);
p4 = new Point(390, 100);
lampView.SetPosition(p1, p2, p3, p4);
}
// 重写run
public void run() {
System.out.println("开始" + getName()+SunFlag);
for (int i = 0; i < 400; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.dataSet(i);
if(SunFlag==false)break;
if(i==399)
System.out.println("接力完成!");
}
}
// 给图形赋值
public void dataSet(int i) {
if (i < 100) {
p1.x = i;
lampView.SetPosition(p1, p2, p3, p4);
// lampView.lamp2.setLocation(p1);
} else if (i < 200) {
p2.x = i + 30;
lampView.SetPosition(p1, p2, p3, p4);
} else if (i < 300) {
p3.x = i + 60;
lampView.SetPosition(p1, p2, p3, p4);
} else if (i < 400) {
p4.x = i + 90;
lampView.SetPosition(p1, p2, p3, p4);
}
}
}
//主函数
public class lamp {
public static void main(String[] args) {
ThreadLamp lampGo=new ThreadLamp("接力开始", 0);
while(true) //等待按键按下
{
@SuppressWarnings("resource")
Scanner scon=new Scanner(System.in);
String strin=scon.nextLine();
System.out.println(strin);
if(strin.equals("S")||strin.equals("s"))
{
System.out.println("开始");
lampGo.start();
}
else if(strin.equals("Q")||strin.equals("Q"))
{
//lampGo.stop();
System.out.println("停止");
lampGo.setSunFlag(false);
}
else {
System.out.println("输入有误!请重新输入");
}
}
}
}
运行结果: