📄 park.java
字号:
package parkproject;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.io.File;
import java.io.FileWriter;
import java.text.*;
class park
implements Runnable {
int carplace_width, carplace_height;
int carWidth, carHeight;
int n, e;
int parkWidth, parkHeight;
door entranceDoor, exitDoor;
// thread of entrancedoor and exitdoor
int roadWidth = 50;
Thread door1, door2;
//
JPanel box;
int roadholder[];
int placeholder[];
int x0 = 100, y0 = 100;
int px = 100, py = 0;
int doorx1 = 0, doory1 = 0;
int doorx2 = 0, doory2 = 0;
//reader and sensor
cardReader readerEntrance,readerExit;
sensor sensorEntrance,sensorExit;
//the display data and its label
JLabel jLabel3 = new JLabel();
JLabel currentTotal = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel total_in = new JLabel();
JLabel jLabel5 = new JLabel();
JLabel total_out = new JLabel();
JLabel jLabel6 = new JLabel();
JLabel average_stop_time = new JLabel();
JLabel currentTime = new JLabel();
JLabel signOfFull = new JLabel();
//parkCar used to store the thread of car;
Vector parkCar = new Vector(3, 2);
int flagIncar[];
//to indicate which car has been in park
int totalCar = 0;
String beginTime;
int totalStopTime = 0; //the total stop time,unit is s;
public park(int n, int e, JPanel b) {
box = b;
carplace_width = 25;
carplace_height = 50; //car place 's length and height
carWidth = 25;
carHeight = 50;
this.n = n; //
this.e = e;
parkWidth = (n + 2) * carplace_width; //park's total width and height
parkHeight = 3 * carplace_height;
//add door here
entranceDoor = new door(roadWidth);
exitDoor = new door(roadWidth);
//entranceDoor's XY
doorx1 = x0 + px - carplace_width;
doory1 = y0 + py + carplace_height;
//exitDoor's XY
doorx2 = x0 + px + (n + 1) * carplace_width;
doory2 = y0 + py + carplace_height;
entranceDoor.setBounds(doorx1, doory1, 5, carplace_height);
exitDoor.setBounds(doorx2, doory2, 5, carplace_height);
box.add(entranceDoor, null);
box.add(exitDoor, null);
//initial the holders
initialroadHolder();
initplaceHolder();
//draw park
drawPlace();
drawparkRect();
//create two threads,door1 and door2
door1 = new Thread(entranceDoor);
door2 = new Thread(exitDoor);
flagIncar = new int[e + 1];
initflag();
//start thread
door1.start();
door2.start();
//init the display information
initData();
Thread tempx = new Thread(this);
tempx.start();
//start
//init and add cardReader and Sensor
addReader();
addSensor();
SimpleDateFormat sdf = new SimpleDateFormat("hhmmss");
beginTime = sdf.format(new Date());
}
public void initflag() {
for (int i = 0; i < e + 1; i++)
flagIncar[i] = -1;
}
public void addCar(car mycar) {
parkCar.add(mycar);
int carNum = mycar.getNumid();
flagIncar[carNum] = 1;
totalCar++;
}
synchronized public boolean checkCar(int numid) {
if (numid < 0 || numid > e) //car num is not valid
{
signOfFull.setText("不是公司的车");
return false;
}
if (totalCar >= 2 * n) // the park is full
{
signOfFull.setText("无车位");
return false;
}
if (flagIncar[numid] == 1) //a car with same id has been in the park
{
signOfFull.setText("当前车已在车场");
return false;
}
return true;
}
synchronized public void setSign()
{
signOfFull.setText("");
}
synchronized public void addTime() {
totalStopTime++;
}
public void run() {
int temp = 0;
while (true) {
car_InPark();
car_totalIn();
car_totalOut();
car_averageStop();
currentTime.setText(Integer.toString(temp));
//to set the time
try {
Thread.sleep(1000);
temp++;
}
catch (InterruptedException e) {}
}
}
public void car_InPark() {
currentTotal.setText(Integer.toString(totalCar));
}
public void car_totalIn() {
total_in.setText(Integer.toString(parkCar.size()));
}
public void car_totalOut() {
total_out.setText(Integer.toString(parkCar.size() - totalCar));
}
public void car_averageStop() {
String temp;
if (parkCar.size() > 0) {
temp = Integer.toString(totalStopTime / parkCar.size());
average_stop_time.setText(temp+" s");
}
else
average_stop_time.setText("0");
}
public void initData() {
jLabel3.setText("当前场内车数:");
jLabel3.setBounds(new Rectangle(35, 416, 92, 25));
currentTotal.setText("22");
currentTotal.setBounds(new Rectangle(85, 436, 79, 23));
jLabel4.setText("本次仿真累计入场车数:");
jLabel4.setBounds(new Rectangle(157, 419, 146, 19));
total_in.setText("22");
total_in.setBounds(new Rectangle(187, 439, 63, 18));
jLabel5.setText("本次仿真累计出场车数:");
jLabel5.setBounds(new Rectangle(348, 417, 130, 21));
total_out.setText("22");
total_out.setBounds(new Rectangle(378, 437, 105, 20));
jLabel6.setText("本次仿真汽车的平均停车时间:");
jLabel6.setBounds(new Rectangle(536, 419, 169, 16));
average_stop_time.setText("22");
average_stop_time.setBounds(new Rectangle(586, 439, 128, 20));
currentTime.setText("");
currentTime.setBounds(new Rectangle(480, 14, 64, 24));
signOfFull.setText(" ");
signOfFull.setBounds(doorx1-100,y0+2*carplace_height,100,20);
box.add(signOfFull,null);
box.add(jLabel3, null);
box.add(currentTotal, null);
box.add(jLabel4, null);
box.add(total_in, null);
box.add(jLabel5, null);
box.add(total_out, null);
box.add(jLabel6, null);
box.add(average_stop_time, null);
box.add(currentTime, null);
}
public void drawparkRect() {
//top line
JPanel top = new JPanel();
top.setBorder(BorderFactory.createLineBorder(Color.black));
top.setBounds(new Rectangle(doorx1, y0, parkWidth, 1));
box.add(top, null);
//low line
JPanel low = new JPanel();
low.setBorder(BorderFactory.createLineBorder(Color.black));
low.setBounds(new Rectangle(doorx1, y0 + parkHeight, parkWidth, 1));
box.add(low, null);
//left
//left top
JPanel tmp = new JPanel();
tmp.setBorder(BorderFactory.createLineBorder(Color.black));
tmp.setBounds(new Rectangle(doorx1, y0 + py, 1, carplace_height));
box.add(tmp, null);
//left low
tmp = new JPanel();
tmp.setBorder(BorderFactory.createLineBorder(Color.black));
tmp.setBounds(new Rectangle(doorx1, y0 + py + 2 * carplace_height, 1,
carplace_height));
box.add(tmp, null);
//right top
tmp = new JPanel();
tmp.setBorder(BorderFactory.createLineBorder(Color.black));
tmp.setBounds(new Rectangle(doorx2, y0 + py, 1, carplace_height));
box.add(tmp, null);
//right low
tmp = new JPanel();
tmp.setBorder(BorderFactory.createLineBorder(Color.black));
tmp.setBounds(new Rectangle(doorx2, y0 + py + 2 * carplace_height, 1,
carplace_height));
box.add(tmp, null);
}
public void drawPlace() {
int x, y, width, height;
y = y0;
width = carplace_width;
height = carplace_height;
x = x0 + px;
Graphics g;
g = box.getGraphics();
//draw the north car place
for (int i = 1; i <= n + 1; i = i + 1) {
JPanel jPanel3 = new JPanel();
jPanel3.setBorder(BorderFactory.createLineBorder(Color.black));
jPanel3.setBounds(new Rectangle(x, y, 1, height));
box.add(jPanel3, null);
x = x + width;
}
x = x0 + px;
y = y0 + 2 * height;
//draw the south car place
for (int i = 1; i <= n + 1; i = i + 1) {
JPanel jPanel3 = new JPanel();
jPanel3.setBorder(BorderFactory.createLineBorder(Color.black));
jPanel3.setBounds(new Rectangle(x, y, 1, height));
box.add(jPanel3, null);
x = x + width;
}
}
public void initialroadHolder() { //road
roadholder = new int[n + 6];
for (int i = 0; i < roadholder.length; i++)
roadholder[i] = -1;
}
public void initplaceHolder() {
placeholder = new int[2 * n + 1];
for (int i = 0; i < placeholder.length; i++)
placeholder[i] = -1;
}
synchronized public void setRoadHolder(int k, int num) {
roadholder[k] = num;
}
synchronized public int getRoadHolder(int k) {
return roadholder[k];
}
synchronized public void setEntranceDoorFlag() {
readerEntrance.setBackground(Color.GREEN);
entranceDoor.open();
}
synchronized public void SetEntranceDoorCloseFlag() {
// sensorEntrance.changeColor(Color.GREEN);
readerEntrance.setBackground(Color.red);
entranceDoor.close();
}
synchronized public void setExitDoorFlag() {
// sensorEntrance.changeColor(Color.GREEN);
readerExit.setBackground(Color.GREEN);
exitDoor.open();
}
synchronized public void SetExitDoorCloseFlag() {
//sensorEntrance.changeColor(Color.GREEN);
readerExit.setBackground(Color.red);
exitDoor.close();
}
synchronized public void deleteOneCar(int carNum) {
flagIncar[carNum] = -1;
totalCar--;
}
public int getX0() {
return x0 + px;
}
public int getY0() {
return y0 + py;
}
public boolean getdoor1Flag() {
return entranceDoor.getFlag();
}
synchronized public boolean getdoor2Flag() {
return exitDoor.getFlag();
}
synchronized public int getplaceHolder(int k) {
return placeholder[k];
}
synchronized public void setplaceHolder(int k, int n) {
placeholder[k] = n;
}
synchronized public boolean checkout(int num)
{
if(num == e || num == e/2)
return false;
//if(num%2==0)
// return false;
return true;
}
public int getN() {
return n;
}
public int getE() {
return e;
}
public int getEmptyPlace()
{
for(int i = 2*n; i>=1;i--)
{
if(placeholder[i]==-1)
return i;
}
return -1;
}
public boolean checkback(int k1,int k2)
{
for(int i=k1;i<k2;i++)
{
if(roadholder[i]==-1)
continue;
else
return false;
}
return true;
}
//to save the Data
public void saveData() throws Exception {
String thedate;
//String beginTime;
String endTime;
String filename;
Date date = new Date();
SimpleDateFormat df;
df = new SimpleDateFormat("yyMMdd");
thedate = df.format(date);
//begin date
df = new SimpleDateFormat("hhmmss");
endTime = df.format(date);
filename = thedate + "_" + beginTime + "_" + endTime + ".rpt";
File myfile = new File(filename);
FileWriter f = new FileWriter(myfile);
f.write("本次累计入场车数:" + total_in.getText() + "\n");
f.write("本次仿真累计出场车数:" + total_out.getText() + "\n");
f.write("本次仿真汽车的平均停车时间:" + average_stop_time.getText() + "\n");
f.close();
}
public void addReader()
{
readerEntrance = new cardReader(doorx1-15,y0 + carplace_height-10);
box.add(readerEntrance,null);
readerExit = new cardReader(doorx2-15,y0 + carplace_height-10);
box.add(readerExit,null);
}
public void addSensor()
{
sensorEntrance = new sensor(doorx1+10,y0+carplace_height+carplace_height/2-5);
box.add(sensorEntrance,null);
sensorExit = new sensor(doorx2+10,y0+carplace_height+carplace_height/2-5);
box.add(sensorExit,null);
}
class cardReader
extends JPanel {
public cardReader(int x,int y) {
super.setBorder(BorderFactory.createLineBorder(Color.black));
this.setBounds(x, y, 10, 10);
this.setBackground(Color.red);
}
// public void paint(Graphics g)
// {
// g.drawLine(0,0,5,10);
// g.drawLine(0,10,5,10);
// g.drawLine(0,0,10,0);
// }
}
class sensor
extends JPanel {
Color c = Color.red;
public sensor(int x, int y) {
super.setBorder(BorderFactory.createLineBorder(Color.black));
this.setBounds(x, y, 10, 10);
//this.setBackground(Color.red);
}
public void paint(Graphics g) {
g.setColor(c);
g.fillOval(0, 0, 10, 10);
}
public void changeColor(Color c) {
this.c = c;
this.repaint();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -