Java程序设计课程设计项目名称

项目名称:自动挡汽车操作模拟系统的设计与实现

英文名称:Design and Implementation of Operation Simulation System aboutAutomatic Vehicle

1、功能描述:

1)汽车的操作正常为启动(或熄火)、挂档、制动、油门控制等操作;

2)挂档实现自动挡的4档操作,既驻车档、倒车档、空档、行车档;

3)使用图形界面进行操作,汽车的状态在图形界面上显示出来;

4)操作流程不合理,要有相应的控制;

5)附加功能:

(1)汽车的油也要进行控制,发动机需要消耗汽油,提供汽油报警功能;

(2)汽车的行程数进行控制,用户界面显示当前行程数;

6)正常操作流程为:启动->刹车->挂档->放刹车->汽车运动->加油门->刹车->驻车档->熄火。行驶中严禁换挡,行驶档位不能启动。

参考文档:

【1】系统类的API文档,见CarApp.jar文件内的doc下的index.html文件

【2】系统运行效果,使用控制台,输入命令为:java –jar CarApp.jar

【3】汽车的运行可以选择gif文件,从网上搜索关键词“车运动  gif”或“动漫小车”等关键字搜索你喜欢的gif小车运动图片,然后使用“工具GIF帧提取器 V1.1 绿色版.rar”提出图片中的每帧图片。

【4】系统的运行效果参考图见图1.

图1:系统运行效果图​​

主要有四个类

测试类

public class CarApp {
public static void main(String[] args){
new MyFrame();
}
}

窗口类

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

//import javafx.beans.value.ChangeListener;
import javax.swing.;
import javax.swing.event.
;

public class MyFrame extends JFrame implements ActionListener{
private JPanel pl1;
private JPanel pl2;
private JPanel pl3;
private JToggleButton start;
private JToggleButton barke;
private CardLayout card = null;
private MytomaticCar car;
private JRadioButton rb1;
private JRadioButton rb2;
private JRadioButton rb3;
private JRadioButton rb4;
private JSlider s2;//一个让用户以图形方式在有界区间内通过移动滑块来选择值的组件。
public JTextArea area1;
private JTextArea area;
private JButton refresh,jiayou;
private int s;
private JTextArea ll3;
public MyFrame(){
//大容器设置
super("自动挡小车模拟驾驶系统");
pack();//调整此窗口的大小,以适合其子组件的首选大小和布局
//setDefaultCloseOperation(3);//默认关闭状态
setSize(500, 680);
Dimension screen = //屏幕居中
Toolkit.getDefaultToolkit().getScreenSize();
setLocation((int)((screen.getWidth() - getWidth()) / 2.0D), (int)((screen.getHeight() - getHeight()) / 2.0D));

    this.car= new MytomaticCar(new Engine());//创建自动控制对象并以发动机作为参数调用相应的构造函数this.card = new CardLayout();//容器上部分this.pl1= new JPanel(card);//创建容器对象采用卡片布局add(this.pl1, BorderLayout.NORTH);this.pl1.setBorder(BorderFactory.createTitledBorder("汽车状态显示"));//BorderFactory创建一个具有指定颜色的线边框。ImageIcon[] ims = new ImageIcon[25];//创建一个数组未初始化的图像图标。int i = 0;String[] imfn = new String[25];//用来存储相对路径制定文件名JPanel[] pls = new JPanel[25];//面板数组装卡片for (i = 0; i < 25; i++) imfn[i] = (".\\images\\Frame" + i + ".jpg");for (i = 0; i < 25; i++) ims[i] = new ImageIcon(imfn[i]);//根据指定的文件创建一个 ImageIcon,指定 String 可以是一个文件名或是一条文件路径  for (i = 0; i < 25; i++) {pls[i] = new JPanel();//创建对象并加载图片到面板上pls[i].add(new JLabel(ims[i]));//把图片放在标签中再放到面板中显示this.pl1.add(pls[i], "p" + i);//加到面板中去 同时命名}//容器中间部分(显示耗油量和里程数)this.pl3 = new JPanel();this.pl3.setBorder(BorderFactory.createTitledBorder("数据显示"));           add(this.pl3,BorderLayout.CENTER);JLabel jl1 = new JLabel("油量(L):");this.area1 = new JTextArea(1,5);this.ll3=new JTextArea(1,7);this.area1.setFont(new Font("华文行楷",Font.BOLD,20));this.ll3.setFont(new Font("华文行楷",Font.BOLD,20));this.ll3.setEditable(false);this.ll3.setBackground(Color.yellow);pl3.add(jl1); pl3.add(ll3);this.jiayou=new JButton("加油");this.jiayou.addActionListener(this);pl3.add(this.jiayou);pl3.add(area1);JLabel jl2 = new JLabel("里程(KM):");       pl3.add(jl2); this.area= new JTextArea(1,5);this.area.setEditable(false);this.area.setBackground(Color.blue);this.area.setForeground(Color.RED);this.area.setFont(new Font("华文行楷",Font.BOLD,20));pl3.add(this.area);this.refresh=new JButton("重置");this.refresh.addActionListener(this);pl3.add(this.refresh);//容器下部分this.pl2 = new JPanel();this.pl2.setBorder(BorderFactory.createTitledBorder("汽车驾驶室"));          add(this.pl2,BorderLayout.SOUTH);//四个小部件的添加JPanel m1=new JPanel();m1.setBorder(BorderFactory.createTitledBorder("引擎发动器"));m1.setLayout(new GridLayout(7,2));//网格布局管理器this.start=new JToggleButton("启动");//JToggleButton按钮按下去会陷下 去,不会弹回来,除非你再按一次this.start.addActionListener(this);//添加监听器m1.add(new JLabel(""));m1.add(this.start);this.pl2.add(m1);this.pl2.add(new JLabel("    "));JPanel m2 = new JPanel();m2.setBorder(BorderFactory.createTitledBorder("制动器"));m2.setLayout(new GridLayout(7,2));//网格布局管理器this.barke=new JToggleButton("制动器");//JToggleButton按钮按下去会陷下 去,不会弹回来,除非你再按一次this.barke.addActionListener(this);//添加监听器m2.add(new JLabel("   "));m2.add(this.barke);this.pl2.add(m2);this.pl2.add(new JLabel("    "));JPanel m3 = new JPanel();m3.setBorder(BorderFactory.createTitledBorder("档位控制器"));m3.setLayout(new GridLayout(1,3));//需要再创一个小面板才能实现排序JPanel m33=new JPanel();m33.setLayout(new GridLayout(8,2));this.rb1 = new JRadioButton("P");this.rb1.addActionListener(this);this.rb1.setSelected(true);//默认位置this.rb2 = new JRadioButton("R");this.rb2.addActionListener(this);this.rb3 = new JRadioButton("N");this.rb3.addActionListener(this);this.rb4 = new JRadioButton("D");this.rb4.addActionListener(this);ButtonGroup grp1 = new ButtonGroup();//单选按钮m3.add(new JLabel("   "));grp1.add(this.rb1); grp1.add(this.rb2); grp1.add(this.rb3); grp1.add(this.rb4);m33.add(this.rb1);m33.add(new JLabel(""));m33.add(this.rb2); m33.add(new JLabel(""));m33.add(this.rb3);m33.add(new JLabel("")); m33.add(this.rb4);m3.add(m33);this.pl2.add(m3);this.pl2.add(new JLabel("     "));JPanel m4 = new JPanel();m4.setBorder(BorderFactory.createTitledBorder("油门控制器"));m4.setLayout(new GridLayout(0, 2));this.s2 = new JSlider(1, 0, 200, 0);this.s2.setForeground(Color.ORANGE);this.s2.setMajorTickSpacing(50);this.s2.setMinorTickSpacing(10);this.s2.setPaintTicks(true);this.s2.setPaintLabels(true);this.s2.setPaintTrack(true);this.s2.setSnapToTicks(true);this.s2.addChangeListener(new ChangeListener()//事件监听器{public void stateChanged(ChangeEvent e){int n = MyFrame.this.s2.getValue();MyFrame.this.car.addSpeed(n);}});m4.add(s2);this.pl2.add(m4);this.pl2.add(new JLabel("     "));int nn=this.car.getoil();this.ll3.setText(""+nn);setVisible(true);//可视 一定放在所有组件放好之后  否则有些不会显示showautocarspeed();//控制显示车速}public void actionPerformed(ActionEvent e){Object o = e.getSource();//获得按钮的变化if ((o instanceof JRadioButton)) {//单选按钮变化JRadioButton rbt = (JRadioButton)e.getSource();//获取按钮状态String ch = rbt.getText();//获得按钮的字符String s = "PRND";int n = s.indexOf(ch);//返回该字符在字符串中出现的位置int gear = this.car.getGear();//获得档位if (!this.car.getParkBrake()){//判断制动器状态JOptionPane.showMessageDialog(this, "制动时才能换挡!", "非法操作", 0);switch (gear) {//制动时候才能换挡的操作若换挡,则不会改变单选按钮的选中状态case 0:this.rb1.setSelected(true);//将该按钮设置为选中模式break;case 1:this.rb2.setSelected(true);break;case 2:this.rb3.setSelected(true);break;case 3:this.rb4.setSelected(true);default:break;}}else {this.car.engageGear(n);//挂档操作}}else if ((o instanceof JToggleButton)) {//判断按钮是否是JToggleButtonJToggleButton jtb = (JToggleButton)o;String name = jtb.getText();if (name.equals("启动")) {this.car.startEngine();this.s2.setValue(1);jtb.setText("熄火");}else if(name.equals("制动器")) {if (!this.car.ParkBrake) {this.car.brake();this.s2.setValue(1);jtb.setText("制动中");} } else if (name.equals("熄火")){if(this.car.getGear()!=0){JOptionPane.showMessageDialog(this, "停车挡才能熄火!", "非法操作", 0);this.start.setSelected(true);}else{jtb.setText("启动");this.rb1.setSelected(true);this.car.flameout();}               }else if(name.equals("制动中")){this.car.freeBrake();jtb.setText("制动器");}}else if((o instanceof JButton)){JButton jtb = (JButton)o;String name = jtb.getText();if((!this.car.getParkBrake()) && (this.car.getEngineThread() != null) && (this.car.getEngineThread().isAlive())){//判断状态JOptionPane.showMessageDialog(this, "运动状态不能进行此操作", "非法操作", 0);}else if(name.equals("重置")){this.area.setText("0");                this.s=0;}else if(name.equals("加油")&& (this.car.getEngineThread() == null)){String sss=area1.getText();int n=Integer.parseInt(sss);       int nn=this.car.getoil();if(nn<500){if(n+nn>=500){this.ll3.setText(""+500);}else{this.car.addOil(n);int ppp=this.car.getoil();this.ll3.setText(""+ppp);}                       }else if(nn==500){JOptionPane.showMessageDialog(this, "油量已满", "非法操作", 0);}                      }               }}    public void showautocarspeed(){while (true){if(this.car.getEngineThread() != null){int n=this.car.getoil();//显示油量this.ll3.setText(""+n);    }if((this.car.getoil()==69)||(this.car.getoil()==70)){JOptionPane.showMessageDialog(this, "油量不足", "非法操作", 0);}if(this.car.getoil()==0){this.start.setText("启动");this.start.setSelected(false);this.car.flameout();}                     try{Thread.sleep(1411 - this.car.getSpeed());if ((!this.car.getParkBrake()) && (this.car.getEngineThread() != null) && (this.car.getEngineThread().isAlive())) {this.area.setText(""+s);    //显示里程      if (this.car.getGear() == 1) {//后退挡this.card.previous(this.pl1);this.s=s+1;continue;}if (this.car.getGear() == 3) {//前进档this.card.next(this.pl1);this.s=s+1;continue;}}}catch (InterruptedException e){e.printStackTrace();} }}

}

引擎类

public class Engine implements Runnable{//多线程,汽车运行是发动机需要启动

public int speed = 0;
private MytomaticCar car;public void setCar(MytomaticCar car){//在汽车上安装发动机this.car = car;
}public void run(){while (true){try{Thread.sleep(2000-this.car.getSpeed());}catch (InterruptedException e){e.printStackTrace();}if(this.car.innage > 0) {this.car.innage -= 1;if(!this.car.getParkBrake()&&this.car.innage > 0)if (this.car.getGear() == 1){this.car.innage -= 1;}else if (this.car.getGear() == 3&&this.car.innage > 1){this.car.innage -= 2;}}else{try{this.car.flameout();}catch (Exception localException){}}if (this.car.innage >= 70)continue;           }}

}
控制室类

public class MytomaticCar {
public static int innage = 500;
private Engine engine;
private Thread engineThread;
public static int P = 0;
public static final int R = 1;
public static final int N = 2;
public static final int D = 3;
public boolean ParkBrake = false;
private int gear = 0;

  public MytomaticCar(){//无参构造方法this.engine = null;}public MytomaticCar(Engine engine) {//有参构造方法this.engine = engine;engine.setCar(this);}public Thread getEngineThread(){//获得发动机线程return this.engineThread;}public void setEngine(Engine engine){//安装发动机this.engine = engine;engine.setCar(this);}public int getoil(){//获取油量return this.innage;}public void addOil(int value){//加油操作if(this.innage<500){this.innage+= value;}}public boolean startEngine(){//启动发动if (this.engineThread == null) {this.engineThread = new Thread(this.engine);}if (!this.engineThread.isAlive()) {this.engineThread.start();System.out.println("发动机启动正常!");}return true;}public void flameout(){//熄火操作try{if (this.engineThread.isAlive())this.engineThread.stop();}catch (Exception localException) {}finally {//初始化操作this.engineThread = null;this.gear = 0;}}public boolean getParkBrake(){//制动状态return this.ParkBrake;}public void freeBrake(){//放刹车if (((this.gear == 1) || (this.gear == 3)) && (this.engineThread != null) && (this.engineThread.isAlive())) {this.engine.speed = 10;}this.ParkBrake = false;}public void brake(){//刹车this.engine.speed = 0;this.ParkBrake = true;}public int getGear(){//获得档位return this.gear;}public void engageGear(int gear){//挂挡操作if (this.ParkBrake)this.gear = gear;}public int getSpeed(){//提出汽车速度return this.engine.speed;}public void addSpeed(int n){//加速if ((this.engine.speed >= 0) && (this.engine.speed < 1200))this.engine.speed = (10 + n * 100);}

}

小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:701136382 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!

转载于:https://blog.51cto.com/14180251/2344210

java实训项目-模拟自动挡汽车相关推荐

  1. JAVA实训项目:银行网银系统管理平台(含源码)

    JAVA实训项目:银行网银系统管理平台(含源码) 文章目录 JAVA实训项目:银行网银系统管理平台(含源码) 前言 一.项目功能需求描述以及相关技术的应用 相关技术应用 二.设计过程 系统流程图 1. ...

  2. 2020年Java实训项目【GUI学生信息管理系统】目录

    Java实训项目1:GUI学生信息管理系统 - 实训概述 Java实训项目2:GUI学生信息管理系统 - 系统概述 Java实训项目3:GUI学生信息管理系统 - 涉及知识点 Java实训项目4:GU ...

  3. Java实训项目:GUI学生信息管理系统(2019)【下】

    Java实训项目:GUI学生信息管理系统(2019)[下] 本篇目录 六.实现步骤 13.应用程序类 14.窗口界面类(JFrame)

  4. Java实训项目:GUI学生信息管理系统(2019)【中】

    Java实训项目:GUI学生信息管理系统(2019)[中] 本篇目录 四.涉及知识点 1.Java基本语法 2.Java流程控制

  5. Java实训项目:GUI学生信息管理系统(2019)【上】

    Java实训项目:GUI学生信息管理系统(2019)[上] 本篇目录 零.实训概述 1.实训目的 2.项目简介

  6. Java实训项目:GUI学生信息管理系统(2017)

    Java实训项目:GUI学生信息管理系统(2017) 实训目的:让学生综合运用J2SE有关知识开发[学生信息管理系统].主要涉及程序控制结构.面向对象编程.图形用户界面.Java数据库应用.MySQL ...

  7. Java实训项目--小型书店管理系统(ssm框架)

    系列文章目录 MyBatis专栏: 一:Java实训项目–小型图书管理系统(ssm框架) 二:"spring与mybatis整合"考试题目测试与解析 三:"SSM框架整合 ...

  8. Java实训项目一一考试系统(附源码)

    1 实训基本信息 1.1 实训项目名称 (1)考试系统 1.2 实训环境 本次实训内容主要针对专业学生,实训形式以实战讲解为主导.实训课程由实训老师主讲,实训老师教学严谨又平易近人,讲解的内容非常细致 ...

  9. Java实训项目1:GUI学生信息管理系统 - 实训概述

    文章目录 一.实训概述 1.实训目的 2.实训项目简介 3.项目开发思维导图 4.实训日志模板 5.实训报告模板 6.实训考核标准 一.实训概述 1.实训目的 让学生综合运用J2SE有关知识开发[学生 ...

最新文章

  1. SQLServer中设置XML索引
  2. 挖矿的大佬们长点心吧
  3. mysql 字段相同条数_用sql语句统计数据库某个字段中相同的数据有多少条?
  4. --- struts数据源配置(详解)---
  5. 2015年 六·一 儿童节——我
  6. android中ActionBar的几个属性
  7. Python标准异常总结
  8. installshield 指定多个自定义路径和文件
  9. Delphi 防止程序多次运行《转》
  10. 单片机学习(四)——ESP8266(最全教程和说明)
  11. MariaDB安装配置
  12. usaco - Raucous Rockers
  13. filter 无效不起作用
  14. Mysql 最全教程
  15. ABAP设置默认打印机
  16. ThinkPad电脑黑屏只显示鼠标
  17. 微服务架构,springcloud核心组件和实战,docker容器
  18. Cisco Packet Tracer的基本应用
  19. 基于知识图谱的智能问答方案
  20. 智慧水库水位库容监测系统解决方案

热门文章

  1. 全媒体运营师胡耀文教你:从0到1搭建直播运营体系
  2. powershell配置anaconda及解决【无法加载文件C:\Users\xxx\Documents\WindowsPowerShell\profile.ps1,因为在此系统上禁止运行脚本】的问题
  3. AD20版如何生成PCB
  4. GUI图像的下拉框组件选择老婆的图片
  5. [neovim/nvim] LSP 与代码补全配置笔记
  6. android jword.zip,Android 项目打包到 JCenter 的坑
  7. Network problems last Friday
  8. 我的Fitbit Force手环使用体验
  9. 好用合并工具安利!需要的来关注一下
  10. 记录STM32的一次不明原因的复位