/*
* @(#)ParkSimulation.java 2008-12-20
*
* Copyright STF
*/
package edu.cqit.ParkSimulation;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
/**
* 停车场模拟程序
*
* @author StarFineJade
*
*/
public class ParkSimulation extends JFrame {
private static final long serialVersionUID = 8599911300306837419L;
/** 标示动态演示间隔时间 */
final static int WAIT_TIME = 500;
//
// 存放汽车信息的储存空间
//
/** <i>便道</i>上的<b>汽车信息</b>的储存空间 */
private LinkedQueue<Car> pavement;
/** <i>停车场</i>中<b>汽车信息</b>的存储空间 */
private Stack<Car> stopping;
/** <i>辅助停车位</i>中<b>汽车信息</b>的存储空间 */
private Stack<Car> buffer;
//
// 控制汽车进出停车场的组件
//
/** 用于<b>控制</b>汽车<em>进入</em><i>停车场</i> */
private JButton comeBtn = new JButton("come");
/** 用于<b>控制</b>汽车<em>离开</em><i>停车场</i> */
private JButton leaveBtn = new JButton("leave");
// 显示汽车信息的组件
/** 用于<b>显示</b>汽车<i>车牌号</i> */
private JTextField carLicenseTf = new JTextField(10);
/** 用于<b>显示</b>汽车<i>当前位置</i> */
private JTextField carStateTf = new JTextField(10);
/** 用于<b>显示</b>汽车<em>进出</em><i>停车场</i>的详细信息 */
private MessagePanel ta = new MessagePanel();
//
// 动态演示部分
//
/** 用于<em>模拟</em><i>停车场</i> */
private StopPanel stoppingArea;
/** 用于<em>模拟</em><i>便道</i> */
private StopPanel pavementArea;
/** 用于<em>模拟</em><i>停车场</i>中的汽车 */
private ImageButton[] stopBtns;
/** 用于<em>模拟</em><i>便道</i>中的汽车 */
private ImageButton[] paveBtns;
/** 用于指示<i>停车场</i>中<strong>最后一辆</strong>汽车的停放位置 */
private int stopPos = 0;
/** 用于指示<i>便道</i>中<strong>最后一辆</strong>汽车的停放位置 */
private int pavePos = 0;
/** 用于表示<i>停车场</i>中<b>准备离开</b>的汽车的停放位置 */
private int leaveCarPos = -1;
/** 指示<i>停车场</i>中可停放汽车的<b>数量</b> */
private int STOPPING_CAPACITY = 7;
/*
* 初始化组件
*/
private void init() {
stoppingArea = new StopPanel(new JLabel("停车场", JLabel.CENTER), STOPPING_CAPACITY);
pavementArea = new StopPanel(new JLabel("便道", JLabel.CENTER), STOPPING_CAPACITY);
stopBtns = new ImageButton[STOPPING_CAPACITY];
paveBtns = new ImageButton[STOPPING_CAPACITY];
ta.initialize();
ActionListener stopListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final int SELECT_POS = Integer.parseInt(e.getActionCommand());
if (SELECT_POS < stopPos) {
leaveCarPos = SELECT_POS;
Car c = stopping.getEementAt(SELECT_POS);
carLicenseTf.setText(c.getLicensePlate());
carStateTf.setText("停车场"+(SELECT_POS+1)+"车位");
}
}
};
ActionListener paveListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final int SELECT_POS = Integer.parseInt(e.getActionCommand());
if (SELECT_POS < pavePos) {
leaveCarPos = -1;
Car c = pavement.getElementAt(SELECT_POS);
carLicenseTf.setText(c.getLicensePlate());
carStateTf.setText("便道"+(SELECT_POS+1)+"车位");
}
}
};
for (int i = 0; i < STOPPING_CAPACITY; i++) {
stopBtns[i] = new ImageButton(""+(i+1));
stopBtns[i].setActionCommand(""+i);
stopBtns[i].setForeground(Color.RED);
stopBtns[i].addActionListener(stopListener);
paveBtns[i] = new ImageButton("empty");
paveBtns[i].setActionCommand(""+i);
paveBtns[i].setForeground(Color.BLUE);
paveBtns[i].addActionListener(paveListener);
stoppingArea.addButton(stopBtns[i]);
pavementArea.addButton(paveBtns[i]);
}
ActionListener l = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ("come".equals(e.getActionCommand())) {
if ("".equals(carStateTf.getText())) {
String carL = carLicenseTf.getText();
if (! "".equals(carL)) {
carCome(carL);
}
}
} else if ("leave".equals(e.getActionCommand())) {
if (leaveCarPos != -1) {
carLeave(leaveCarPos);
leaveCarPos = -1;
}
}
}
};
leaveBtn.setActionCommand("leave");
comeBtn.setActionCommand("come");
carLicenseTf.setActionCommand("come");
leaveBtn.addActionListener(l);
comeBtn.addActionListener(l);
carStateTf.setEditable(false);
carLicenseTf.addActionListener(l);
carLicenseTf.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
carLicenseTf.setText("");
carStateTf.setText("");
leaveCarPos = -1;
}
@Override
public void focusLost(FocusEvent e) {
// carLicenseTf.setText("");
// carStateTf.setText("");
}
});
}
private void display() {
//
// 布置组件
//
Container c = getContentPane();
JPanel rightP = new JPanel();
c.setLayout(new BorderLayout());
rightP.setLayout(new GridLayout(1, 2));
rightP.add(stoppingArea);
rightP.add(pavementArea);
JLabel carLicenseL = new JLabel("车牌号(N):");
JLabel carStateL = new JLabel("状态(S):");
carLicenseL.setDisplayedMnemonic('N');
carLicenseL.setLabelFor(carLicenseTf);
carStateL.setDisplayedMnemonic('S');
carStateL.setLabelFor(carStateTf);
JPanel bottomP = new JPanel();
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
bottomP.setLayout(gbl);
gbl.setConstraints(carLicenseL, gbc);
gbl.setConstraints(carLicenseTf, gbc);
bottomP.add(carLicenseL);
bottomP.add(carLicenseTf);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbl.setConstraints(comeBtn, gbc);
bottomP.add(comeBtn);
gbc.gridwidth = 1;
gbl.setConstraints(carStateL, gbc);
gbl.setConstraints(carStateTf, gbc);
bottomP.add(carStateL);
bottomP.add(carStateTf);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbl.setConstraints(leaveBtn, gbc);
bottomP.add(leaveBtn);
JSplitPane leftPane =
new JSplitPane(JSplitPane.VERTICAL_SPLIT, true);
leftPane.add(new JScrollPane(ta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS));
leftPane.add(new JScrollPane(bottomP));
leftPane.setDividerLocation(238);
JSplitPane splitPane = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT, true);
splitPane.add(leftPane);
splitPane.add(rightP);
splitPane.setDividerLocation(335);
c.add(splitPane, BorderLayout.CENTER);
}
/**
* 构建一个默认大小的<i>停车场</i>,容量为7.
*/
public ParkSimulation() {
this(7);
}
/**
* 构建一个指定大小的<i>停车场</i>。
* @param stopCapacity 停车场容量
*/
public ParkSimulation(int stopCapacity) {
STOPPING_CAPACITY = stopCapacity;
initBuffer();
initPavement();
initStopping();
init();
display();
setSize(560, 350);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/**
* 显示欢迎信息。
*/
public void welcome() {
String msg = "欢迎使用本程序\n有车要进入停车场请输入车牌号然后点击\"come\"" +
"\n有车要离开停车场请点击窗口右边待离开的汽车,然后点击\"leave\"";
JOptionPane.showMessageDialog(this, msg);
}
/**
* 测试停车场是否已满。
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
[问题描述] 设停车厂只有一个可停放几辆汽车的狭长通道,且只有—个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候, 一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该车辆开出大门,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走,试设汁这样一个停车厂模拟管理程序。为了以下描述的方便,停车厂的停车场用“停车位”进行叙述,停车厂的便道用“便道”进行叙述。 [数据结构设计]
资源推荐
资源详情
资源评论
收起资源包目录
.rar (37个子文件)
停车场模拟管理程序
Image
car_icon.jpg 11KB
icon_come.gif 6KB
icon_leave.gif 7KB
parking.jar 28KB
src
edu
cqit
ParkSimulation
index-all.html 53KB
StopPanel.java 3KB
Stack.java 3KB
ImageButton.java 1KB
LinkedQueue.java 3KB
edu
cqit
ParkSimulation
package-summary.html 8KB
Stack.html 14KB
Node.html 17KB
package-frame.html 2KB
Queue.html 11KB
Car.html 14KB
ImageButton.html 27KB
LinkedQueue.html 20KB
package-tree.html 8KB
MessagePanel.html 27KB
ParkSimulation.html 29KB
StopPanel.html 25KB
resources
inherit.gif 57B
stylesheet.css 1KB
allclasses-noframe.html 3KB
ParkSimulation.java 13KB
allclasses-frame.html 3KB
overview-tree.html 7KB
serialized-form.html 11KB
constant-values.html 7KB
package-list 25B
help-doc.html 7KB
deprecated-list.html 5KB
MessagePanel.java 1KB
Car.java 2KB
index.html 1KB
Node.java 2KB
Queue.java 2KB
共 37 条
- 1
资源评论
- wenhao2b2012-12-26为什么 报错 说 没有覆盖超类方法
- 狮子王_没有什么会永垂不朽2014-03-07做的挺好的,可以参考
- woshi9572013-01-12很好用很实用 基本没什么错的
- helene77002012-10-17很好用很实用 基本没什么错的
colvinfang
- 粉丝: 2
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功