用Java代码多线程,集合,网络通信,GUI,IO,写一个租车App

时间: 2023-07-16 17:13:47 浏览: 44
好的,我可以帮你提供一个简单的租车App的Java代码示例,包括多线程、集合、网络通信、GUI、IO等方面。 首先,我们需要定义一个车辆类Car,包含车辆的基本信息: ```java public class Car { private String brand; // 品牌 private String model; // 型号 private double price; // 租金 private boolean isRented; // 是否已被租走 public Car(String brand, String model, double price) { this.brand = brand; this.model = model; this.price = price; this.isRented = false; } // getter和setter方法省略 } ``` 接下来,我们定义一个租车公司类CarRentalCompany,用来管理车辆的租赁: ```java import java.util.ArrayList; import java.util.List; public class CarRentalCompany { private List<Car> cars; // 所有车辆列表 public CarRentalCompany() { // 初始化车辆列表 cars = new ArrayList<>(); cars.add(new Car("Toyota", "Camry", 300)); cars.add(new Car("Honda", "Accord", 350)); cars.add(new Car("Nissan", "Altima", 320)); } // 获取所有未被租走的车辆 public List<Car> getAvailableCars() { List<Car> availableCars = new ArrayList<>(); for (Car car : cars) { if (!car.isRented()) { availableCars.add(car); } } return availableCars; } // 租车 public void rentCar(Car car) { car.setRented(true); } // 还车 public void returnCar(Car car) { car.setRented(false); } } ``` 我们还需要一个客户类Customer,用来租车和还车: ```java public class Customer { private String name; // 姓名 private CarRentalCompany company; // 所属租车公司 public Customer(String name, CarRentalCompany company) { this.name = name; this.company = company; } // 租车 public void rentCar(Car car) { company.rentCar(car); System.out.println(name + "租了一辆" + car.getBrand() + " " + car.getModel() + ",租金为" + car.getPrice() + "元/天。"); } // 还车 public void returnCar(Car car) { company.returnCar(car); System.out.println(name + "还了一辆" + car.getBrand() + " " + car.getModel() + "。"); } } ``` 接下来,我们可以编写GUI界面,展示所有可租赁的车辆和已租赁的车辆,并提供租车和还车按钮。这里使用Swing库来实现GUI界面: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; public class CarRentalApp extends JFrame implements ActionListener { private CarRentalCompany company; // 租车公司 private List<Car> availableCars; // 所有未被租走的车辆 private List<Car> rentedCars; // 所有已被租走的车辆 private JList<Car> availableCarList; // 可租赁车辆列表 private JList<Car> rentedCarList; // 已租赁车辆列表 private JButton rentButton; // 租车按钮 private JButton returnButton; // 还车按钮 public CarRentalApp() { company = new CarRentalCompany(); // 初始化GUI界面 setTitle("租车App"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setPreferredSize(new Dimension(600, 400)); setLayout(new BorderLayout()); // 获取所有未被租走的车辆 availableCars = company.getAvailableCars(); // 获取所有已被租走的车辆 rentedCars = new ArrayList<>(); for (Car car : company.getCars()) { if (car.isRented()) { rentedCars.add(car); } } // 可租赁车辆列表 availableCarList = new JList<>(availableCars.toArray(new Car[0])); availableCarList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane availableScrollPane = new JScrollPane(availableCarList); availableScrollPane.setPreferredSize(new Dimension(250, 300)); add(availableScrollPane, BorderLayout.WEST); // 已租赁车辆列表 rentedCarList = new JList<>(rentedCars.toArray(new Car[0])); rentedCarList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane rentedScrollPane = new JScrollPane(rentedCarList); rentedScrollPane.setPreferredSize(new Dimension(250, 300)); add(rentedScrollPane, BorderLayout.EAST); // 租车按钮 rentButton = new JButton("租车"); rentButton.addActionListener(this); add(rentButton, BorderLayout.NORTH); // 还车按钮 returnButton = new JButton("还车"); returnButton.addActionListener(this); add(returnButton, BorderLayout.SOUTH); pack(); setVisible(true); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == rentButton) { // 租车 Car selectedCar = availableCarList.getSelectedValue(); if (selectedCar != null) { Customer customer = new Customer("张三", company); customer.rentCar(selectedCar); availableCars.remove(selectedCar); rentedCars.add(selectedCar); availableCarList.setListData(availableCars.toArray(new Car[0])); rentedCarList.setListData(rentedCars.toArray(new Car[0])); } } else if (e.getSource() == returnButton) { // 还车 Car selectedCar = rentedCarList.getSelectedValue(); if (selectedCar != null) { Customer customer = new Customer("张三", company); customer.returnCar(selectedCar); rentedCars.remove(selectedCar); availableCars.add(selectedCar); availableCarList.setListData(availableCars.toArray(new Car[0])); rentedCarList.setListData(rentedCars.toArray(new Car[0])); } } } public static void main(String[] args) { new CarRentalApp(); } } ``` 最后,我们需要实现网络通信和IO操作,将租车信息写入文件和从文件中读取租车记录。这里我们采用Socket和ObjectOutputStream/ObjectInputStream来实现网络通信和对象的序列化: ```java import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class CarRentalServer { private List<Car> cars; // 所有车辆列表 private List<RentalRecord> rentalRecords; // 租车记录列表 public CarRentalServer() { // 初始化车辆列表 cars = new ArrayList<>(); cars.add(new Car("Toyota", "Camry", 300)); cars.add(new Car("Honda", "Accord", 350)); cars.add(new Car("Nissan", "Altima", 320)); // 初始化租车记录列表 rentalRecords = new ArrayList<>(); // 启动服务器 try { ServerSocket serverSocket = new ServerSocket(8888); while (true) { Socket socket = serverSocket.accept(); new ClientHandler(socket).start(); } } catch (IOException e) { e.printStackTrace(); } } private synchronized void rentCar(String customerName, Car car) { car.setRented(true); rentalRecords.add(new RentalRecord(customerName, car, true)); } private synchronized void returnCar(String customerName, Car car) { car.setRented(false); rentalRecords.add(new RentalRecord(customerName, car, false)); } private void saveRentalRecords() { try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("rental_records.dat")); oos.writeObject(rentalRecords); oos.close(); } catch (IOException e) { e.printStackTrace(); } } private void loadRentalRecords() { try { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("rental_records.dat")); rentalRecords = (List<RentalRecord>) ois.readObject(); ois.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } private class ClientHandler extends Thread { private Socket socket; public ClientHandler(Socket socket) { this.socket = socket; } @Override public void run() { try { ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); String command = (String) ois.readObject(); if (command.equals("rent")) { String customerName = (String) ois.readObject(); Car car = (Car) ois.readObject(); rentCar(customerName, car); } else if (command.equals("return")) { String customerName = (String) ois.readObject(); Car car = (Car) ois.readObject(); returnCar(customerName, car); } else if (command.equals("load")) { ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject(cars); oos.writeObject(rentalRecords); oos.close(); } else if (command.equals("save")) { saveRentalRecords(); } ois.close(); socket.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } public static void main(String[] args) { new CarRentalServer(); } } ``` 客户端代码如下: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.Socket; import java.util.List; public class CarRentalClient extends JFrame implements ActionListener { private List<Car> cars; // 所有车辆列表 private List<RentalRecord> rentalRecords; // 租车记录列表 private JList<Car> availableCarList; // 可租赁车辆列表 private JList<RentalRecord> rentalRecordList; // 租车记录列表 private JButton rentButton; // 租车按钮 private JButton returnButton; // 还车按钮 private JButton saveButton; // 保存按钮 public CarRentalClient() { // 初始化GUI界面 setTitle("租车App"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setPreferredSize(new Dimension(800, 400)); setLayout(new BorderLayout()); // 可租赁车辆列表 availableCarList = new JList<>(); availableCarList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane availableScrollPane = new JScrollPane(availableCarList); availableScrollPane.setPreferredSize(new Dimension(250, 300)); add(availableScrollPane, BorderLayout.WEST); // 租车记录列表 rentalRecordList = new JList<>(); rentalRecordList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane rentalScrollPane = new JScrollPane(rentalRecordList); rentalScrollPane.setPreferredSize(new Dimension(500, 300)); add(rentalScrollPane, BorderLayout.EAST); // 租车按钮 rentButton = new JButton("租车"); rentButton.addActionListener(this); add(rentButton, BorderLayout.NORTH); // 还车按钮 returnButton = new JButton("还车"); returnButton.addActionListener(this); add(returnButton, BorderLayout.CENTER); // 保存按钮 saveButton = new JButton("保存"); saveButton.addActionListener(this); add(saveButton, BorderLayout.SOUTH); pack(); setVisible(true); // 从服务器加载数据 loadDataFromServer(); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == rentButton) { // 租车 Car selectedCar = availableCarList.getSelectedValue(); if (selectedCar != null) { try { Socket socket = new Socket("localhost", 8888); ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject("rent"); oos.writeObject("张三"); oos.writeObject(selectedCar); oos.close(); socket.close(); loadDataFromServer(); } catch (IOException ex) { ex.printStackTrace(); } } } else if (e.getSource() == returnButton) { // 还车 RentalRecord selectedRecord = rentalRecordList.getSelectedValue(); if (selectedRecord != null && selectedRecord.isRent()) { try { Socket socket = new Socket("localhost", 8888); ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject("return"); oos.writeObject("张三"); oos.writeObject(selectedRecord.getCar()); oos.close(); socket.close(); loadDataFromServer(); } catch (IOException ex) { ex.printStackTrace(); } } } else if (e.getSource() == saveButton) { // 保存租车记录 try { Socket socket = new Socket("localhost", 8888); ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject("save"); oos.close(); socket.close(); } catch (IOException ex) { ex.printStackTrace(); } } } private void loadDataFromServer() { try { Socket socket = new Socket("localhost", 8888); ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject("load"); oos.close(); ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); cars = (List<Car>) ois.readObject(); rentalRecords = (List<RentalRecord>) ois.readObject(); ois.close(); socket.close(); // 更新GUI界面 availableCarList.setListData(cars.toArray(new Car[0])); rentalRecordList.setListData(rentalRecords.toArray(new RentalRecord[0])); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { new CarRentalClient(); } } ``` 这样,我们就完成了一个简单的租车App,并实现了多线程、集合、网络通信、GUI、IO等方面的应用。

相关推荐

最新推荐

recommend-type

Java Web项目中使用Socket通信多线程、长连接的方法

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听。接下来通过本文给大家介绍Java Web项目中使用Socket通信多线程、长连接的...
recommend-type

基于GUI的网络通信程序设计.docx

实验二 基于GUI的网络通信程序设计 一.实验目的 1.掌握Java中GUI程序的编写,包括事件监听机制。 2.掌握Java的网络通信编程,ServerSocket,Socket类的使用。 3.掌握Java中多线程的编程,Thread类,Runnable...
recommend-type

Java模拟多线程实现抢票代码实例

主要介绍了Java模拟多线程实现抢票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

Java多线程之多线程异常捕捉

在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉,通过此篇文章给大家分享Java多线程之多线程异常捕捉,需要的朋友可以参考下
recommend-type

Java创建多线程异步执行实现代码解析

主要介绍了Java创建多线程异步执行实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

Redis验证与连接:快速连接Redis服务器指南

![Redis验证与连接:快速连接Redis服务器指南](https://img-blog.csdnimg.cn/20200905155530592.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTg5NTEw,size_16,color_FFFFFF,t_70) # 1. Redis验证与连接概述 Redis是一个开源的、内存中的数据结构存储系统,它使用键值对来存储数据。为了确保数据的安全和完整性,Redis提供了多
recommend-type

gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker app:app 报错 ModuleNotFoundError: No module named 'geventwebsocket' ]

这个报错是因为在你的环境中没有安装 `geventwebsocket` 模块,可以使用下面的命令来安装: ``` pip install gevent-websocket ``` 安装完成后再次运行 `gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker app:app` 就不会出现这个报错了。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。