Java实现超市购物系统

本文介绍了一个简单的水果店管理系统的设计与实现过程,包括系统架构、界面设计、功能模块等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次内容大致分为9个版面

1、view视图
2、tool 工具包类
3、test 测试类
4、service 管理员服务类
5、domain 水果数据模型
6、data 数据存储类
7、dao 管理员数据访问类
8、controller 界面操作类
9、app 项目运行

做项目之前首先要实现的是前台也就是我们的view视图

窗体的构造

    package cn.itcast.fruitstore.view;
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import cn.itcast.fruitstore.tools.GUITools;
    /**
     * 主窗口类
     */
    @SuppressWarnings("serial")
    public abstract class AbstractMainFrame extends JFrame {
    	//组件
    	private JLabel titleLabel = new JLabel(new ImageIcon("FruitStore.jpg"));//标题图片
    	private JButton btn = new JButton("进入系统");//顾客按钮
    	//构造函数
    	public AbstractMainFrame() {
    		this.init();// 初始化操作
    		this.addComponent();// 添加组件
    		this.addListener();// 添加监听器
    	}	
    	//初始化操作
    	private void init() {
    		this.setTitle("水果超市欢迎您!");// 标题
    		this.setSize(600, 400);// 窗体大小与位置
    		GUITools.center(this);//设置窗口在屏幕上的位置
    		GUITools.setTitleImage(this, "title.png");
    		this.setResizable(false);// 窗体大小固定
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭窗口默认操作
    	}	
    	//添加组件
    	private void addComponent() {
    		//窗体使用默认的边界布局,北区放入图片
    		this.add(this.titleLabel, BorderLayout.NORTH);
    		//创建JPanel对象
    		JPanel btnPanel = new JPanel();
    		//清除布局,使JPanel中的组件可以自定义位置
    		btnPanel.setLayout(null);
    		//将JPanel对象添加到窗体中
    		this.add(btnPanel);	
    		//定义边界位置
    		btn.setBounds(240, 20, 120, 50);
    		//将按钮添加到JPanel对象中
    		btnPanel.add(btn);
    	}
    	//添加监听器
    	private void addListener() {
    		btn.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				showAdminDialog();
    			}
    		});
    	}	
    	//展示管理员界面方法
    	public abstract void showAdminDialog();
    }

**控件的构造**摆防位置

package cn.itcast.fruitstore.view;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import cn.itcast.fruitstore.tools.GUITools;
/**
 * 管理窗口类
 */
@SuppressWarnings("serial")
public abstract class AbstractAdminDialog extends JDialog{
	//定义界面使用到的组件作为成员变量
	private JLabel tableLabel = new JLabel("水果列表");//水果列表标题
	private JScrollPane tablePane = new JScrollPane();//滚动视口
	protected JTable table = new JTable(); //水果列表	
	private JLabel numberLabel = new JLabel("水果编号");//编号标题
	private JLabel nameLabel = new JLabel("水果名称");//名称标题
	private JLabel priceLabel = new JLabel("水果单价");//单价标题
	private JLabel unitLabel = new JLabel("计价单位");//计价单位标题
	//添加功能组件
	protected JTextField addNumberText = new JTextField(6);//添加编号文本框
	protected JTextField addNameText = new JTextField(6);//添加名称文本框
	protected JTextField addPriceText = new JTextField(6);//添加单价文本框
	protected JTextField addUnitText = new JTextField(6);//添加计价单位文本框
	private JButton addBtn = new JButton("添加水果");//添加按钮
	//修改功能组件
	protected JTextField updateNumberText = new JTextField(6);//修改编号文本框
	protected JTextField updateNameText = new JTextField(6);//修改名称文本框
	protected JTextField updatePriceText = new JTextField(6);//修改单价文本框
	protected JTextField updateUnitText = new JTextField(6);//修改计价单位文本框
	private JButton updateBtn = new JButton("修改水果");//修改按钮
	//删除功能组件
	protected JTextField delNumberText = new JTextField(6);//添加编号文本
	private JButton delBtn = new JButton("删除水果");//删除按钮	
	//构造方法
	public AbstractAdminDialog() {
		this(null,true);
	}
	public AbstractAdminDialog(Frame owner, boolean modal) {
		super(owner, modal);
		this.init();// 初始化操作
		this.addComponent();// 添加组件
		this.addListener();// 添加监听器
	}
	// 初始化操作
	private void init() {
		this.setTitle("超市货物管理!");// 标题
		this.setSize(600, 400);// 窗体大小与位置
		GUITools.center(this);//设置窗口在屏幕上的位置
		this.setResizable(false);// 窗体大小固定
	}	
	// 添加组件
	private void addComponent() {		
		//取消布局
		this.setLayout(null);		
		//表格标题
		tableLabel.setBounds(265, 20, 70, 25);
		this.add(tableLabel);		
		//表格
		table.getTableHeader().setReorderingAllowed(false);	//列不能移动
		table.getTableHeader().setResizingAllowed(false); 	//不可拉动表格
		table.setEnabled(false);							//不可更改数据
		tablePane.setBounds(50, 50, 500, 200);				
		tablePane.setViewportView(table);					//视口装入表格
		this.add(tablePane);		
		//字段标题
		numberLabel.setBounds(50, 250, 70, 25);	
		nameLabel.setBounds(150, 250, 70, 25);	
		priceLabel.setBounds(250, 250, 70, 25);	
		unitLabel.setBounds(350, 250, 70, 25);	
		this.add(numberLabel);
		this.add(nameLabel);
		this.add(priceLabel);
		this.add(unitLabel);		
		//增加组件
		addNumberText.setBounds(50, 280, 80, 25);
		addNameText.setBounds(150, 280, 80, 25);
		addPriceText.setBounds(250, 280, 80, 25);
		addUnitText.setBounds(350, 280, 80, 25);
		this.add(addNumberText);
		this.add(addNameText);
		this.add(addPriceText);
		this.add(addUnitText);
		addBtn.setBounds(460, 280, 90, 25);
		this.add(addBtn);		
		//修改组件
		updateNumberText.setBounds(50, 310, 80, 25);
		updateNameText.setBounds(150, 310, 80, 25);
		updatePriceText.setBounds(250, 310, 80, 25);
		updateUnitText.setBounds(350, 310, 80, 25);
		this.add(updateNumberText);
		this.add(updateNameText);
		this.add(updatePriceText);
		this.add(updateUnitText);
		updateBtn.setBounds(460, 310, 90, 25);
		this.add(updateBtn);		
		//删除组件
		delNumberText.setBounds(50, 340, 80, 25);
		this.add(delNumberText);
		delBtn.setBounds(460, 340, 90, 25);
		this.add(delBtn);
	}	
	// 添加监听器
	private void addListener() {		
		//添加按钮监听
		addBtn.addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent e) {
				//调用添加方法
				addFruitItem();
			}
		});
		//修改按钮监听
		updateBtn.addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent e) {
				//调用修改方法
				updateFruitItem();
			}
		});
		//删除按钮监听
		delBtn.addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent e) {
				//调用删除方法
				delFruitItem();
			}
		});
	}	
	//查询方法
	public abstract void queryFruitItem();
	//添加方法
	public abstract void addFruitItem();
	//修改方法
	public abstract void updateFruitItem();
	//删除方法
	public abstract void delFruitItem();
}

进行视图的测试看看摆放位置是否准确(窗体测试类)

ackage cn.itcast.fruitstore.test;
import cn.itcast.fruitstore.view.AbstractMainFrame;
/**
 * 主窗口测试类
 */
@SuppressWarnings("serial")
public class AbstractMainFrameTest extends AbstractMainFrame {
	//定义主函数
	public static void main(String[] args) {
		new AbstractMainFrameTest().setVisible(true);
	}
	//覆盖父类中展示管理员界面的方法
	@Override
	public void showAdminDialog() {
		System.out.println("进入管理界面");
	} 
}

控件测试类

package cn.itcast.fruitstore.test;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import cn.itcast.fruitstore.view.AbstractAdminDialog;
/*
 * 管理界面测试类
 */
@SuppressWarnings("serial")
public class AbstractAdminDialogTest extends AbstractAdminDialog{
	//定义构造函数初始化数据
	public AbstractAdminDialogTest() {
		super();
		queryFruitItem();//测试数据
	}	
	//加入测试table数据
	@Override
	public void queryFruitItem() {
		String[] thead = new String[]{"水果编号","水果名称","水果单价(/元)","计价单位"};
		String[][] tbody = new String[][]{
				{"1","苹果","5.0","kg"},
				{"2","葡萄","3.2","斤"},
				{"3","雪梨","3.8","斤"},
				{"4","泰国大榴莲","120","个"}
				};
		TableModel data = new DefaultTableModel(tbody,thead);
		table.setModel(data);
	}
	@Override
	public void addFruitItem() {
	}
	@Override
	public void updateFruitItem() {
	}
	@Override
	public void delFruitItem() {
	}
    //定义主函数运行程序
	public static void main(String[] args) {
		//创建界面并显示
		new AbstractAdminDialogTest().setVisible(true);
	}
}

工具类的介绍(进行控件的居中与图标的改变是比较重要的一个工具包)

package cn.itcast.fruitstore.tools;
import java.awt.Component;
import java.awt.Toolkit;
import javax.swing.JFrame;
/*
 * 工具类
 */
public class GUITools {
	//JAVA提供的GUI默认工具类对象
	static Toolkit kit = Toolkit.getDefaultToolkit();
	//将指定组件屏幕居中
	public static void center(Component c) {
		int x = (kit.getScreenSize().width - c.getWidth()) / 2;
		int y = (kit.getScreenSize().height - c.getHeight()) / 2;
		c.setLocation(x, y);
	}
	//为指定窗口设置图标标题
	public static void setTitleImage(JFrame frame,String titleIconPath) {
		frame.setIconImage(kit.createImage(titleIconPath));
	} 
}

因为还未涉及到数据库所有这里使用数组的存储方式(数据库的做法有时间再分享)

package cn.itcast.fruitstore.data;
import java.util.ArrayList;
import cn.itcast.fruitstore.domain.FruitItem;
/**
 * 存储数据
 */
public class DataBase {
	public static ArrayList<FruitItem> data = new ArrayList<FruitItem>();	
	//初始数据
	static {		
		data.add(new FruitItem("1","苹果",5.0,"kg"));
	}
}

进行水果模型的构造 domain类

package cn.itcast.fruitstore.domain;
/*
 * 水果项数据模型
 */
public class FruitItem {
	//属性
	private String number;//编号
	private String name;  //名称
	private double price; //价格
	private String unit;  //单位
	//构造方法
	public FruitItem() {
	} 
	public FruitItem(String number, String name, double price, String unit) {
		super();
		this.number = number;
		this.name = name;
		this.price = price;
		this.unit = unit;
	}
	//get/set方法
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public String getUnit() {
		return unit;
	}
	public void setUnit(String unit) {
		this.unit = unit;
	}
}

管理员数据访问类、主要进行建立基础的增加修改和删除的操作

package cn.itcast.fruitstore.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
//import cn.itcast.fruitstore.data.DataBase;
import cn.itcast.fruitstore.domain.FruitItem;
import cn.itcast.fruitstore.tools.JDBCUtils;
/*
 * 管理员数据访问类
 */
public class AdminDao {
	/*
	 * 
	//获取所有数据
	public ArrayList<FruitItem> queryAllData() {		
		return DataBase.data;
	}
	//添加数据
	public void addFruitItem(FruitItem fruitItem) {
		DataBase.data.add(fruitItem);
	}
	//删除数据
	public void delFruitItem(String delNumber) {
		//查询集合中数据
		for (int i = 0; i < DataBase.data.size(); i++) {
			FruitItem thisFruitItem = DataBase.data.get(i);
			//如果有水果项的编号与传入编号相同,则从集合中删除
			if(thisFruitItem.getNumber().equals(delNumber)) {
				DataBase.data.remove(i);
			}
		}
	}
  */
//------为了方便读者学习,以上为原来使用集合模拟数据库的方法,以下为连接MySQL数据库后的方法--------------------------------------------	
	// 获取所有数据
	public ArrayList<FruitItem> queryAllData() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		ArrayList<FruitItem> list = new ArrayList<FruitItem>();
		try {
			// 获得数据的连接
			conn = JDBCUtils.getConnection();
			// 获得Statement对象
			stmt = conn.createStatement();
			// 发送SQL语句
			String sql = "SELECT * FROM fruit";
			rs = stmt.executeQuery(sql);
			// 处理结果集
			while (rs.next()) {
				FruitItem fruitItem = new FruitItem();
				fruitItem.setNumber(rs.getString("number"));
				fruitItem.setName(rs.getString("fruitname"));
				fruitItem.setPrice(rs.getDouble("price"));
				fruitItem.setUnit(rs.getString("unit"));
				list.add(fruitItem);
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs, stmt, conn);
		}
		return null;
	}
	//添加数据
	public void addFruitItem(FruitItem fruitItem) {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			// 获得数据的连接
			conn = JDBCUtils.getConnection();
			// 获得Statement对象
			stmt = conn.createStatement();
			// 发送SQL语句
			String sql = "INSERT INTO fruit(number,fruitname,price,unit)"
					+ "VALUES(" + fruitItem.getNumber() + ",'" + fruitItem.getName()
					+ "','" + fruitItem.getPrice() + "','" + fruitItem.getUnit()+ "')";
			int num = stmt.executeUpdate(sql);
			if (num > 0) {
				System.out.println("插入数据成功!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs, stmt, conn);
		}	
	}
	//删除数据
	public void delFruitItem(String delNumber) {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			// 获得数据的连接
			conn = JDBCUtils.getConnection();
			// 获得Statement对象
			stmt = conn.createStatement();
			// 发送SQL语句
			String sql = "DELETE FROM fruit WHERE number=" + delNumber;
			int num = stmt.executeUpdate(sql);
			if (num > 0) {
             System.out.println("删除数据成功!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs, stmt, conn);
		}
	}
}

接下来是管理员服务类Service 主要与controller 与dao层的数据进行传递

package cn.itcast.fruitstore.service;
import java.util.ArrayList;
import cn.itcast.fruitstore.dao.AdminDao;
import cn.itcast.fruitstore.domain.FruitItem;
/*
 * 管理员服务类
 */
public class AdminService {
	private AdminDao adminDao = new AdminDao();	
	//查询服务
	public ArrayList<FruitItem> queryFruitItem() {
		//调用Dao层的获取所有数据方法获取所有数据
		ArrayList<FruitItem> data = adminDao.queryAllData();
		//返回数据
		return data;
	} 
	//添加服务
	public boolean addFruitItem(String number, String name, String price,
			String unit) {
		//调用Dao层的获取所有数据方法获取所有数据
		ArrayList<FruitItem> data = queryFruitItem();
		//使用输入的编号与所有数据对比
		for (int i = 0; i < data.size(); i++) {
			FruitItem fruitItem = data.get(i);
			//如果存在重复编号数据,则添加不成功
			if(number.equals(fruitItem.getNumber())) {
				return false;
			}
		}
		//如果没有重复编号,将数据封装为FruitItem对象
		FruitItem thisFruitItem = new FruitItem(number, name,
				Double.parseDouble(price), unit);
		//调用Dao层的添加数据方法
		adminDao.addFruitItem(thisFruitItem);
		//在添加数据后,返回添加成功
		return true;
	}
	//修改服务
	public boolean updateFruitItem(String number, String name,
			String price, String unit) {		
		//调用Dao层的获取所有数据方法获取所有数据
		ArrayList<FruitItem> data = queryFruitItem();
		//使用输入的编号与所有数据对比
		for (int i = 0; i < data.size(); i++) {
			FruitItem fruitItem = data.get(i);
			//如果存在相同编号数据,则可以更新
			if(number.equals(fruitItem.getNumber())) {
				//调用Dao层的删除指定编号数据方法
				adminDao.delFruitItem(number);
				//如果没有重复编号,将数据封装为FruitItem对象
				FruitItem thisFruitItem = new FruitItem(number, name,
						Double.parseDouble(price), unit);
				//调用Dao层的添加数据方法
				adminDao.addFruitItem(thisFruitItem);
				//在修改数据后,返回添加成功
				return true;
			}
		}
		//如果不存在相同编号数据,则不可以更新
		return false;
	}
	//删除服务
	public boolean delFruitItem(String delNumber) {		
		//调用Dao层的获取所有数据方法获取所有数据
		ArrayList<FruitItem> data = queryFruitItem();
		//使用输入的编号与所有数据对比
		for (int i = 0; i < data.size(); i++) {
			FruitItem fruitItem = data.get(i);
			//如果存在相同编号数据,则可以删除
			if(delNumber.equals(fruitItem.getNumber())) {
				//调用Dao层的删除指定编号数据方法
				adminDao.delFruitItem(delNumber);
				//在删除数据后,返回添加成功
				return true;
			}
		}
		//如果不存在相同编号数据,则不可以删除
		return false;
	}
}

接下来便是界面操作类,与service层连接反馈用户进行的操作信息

package cn.itcast.fruitstore.controller;
import java.awt.Frame;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import cn.itcast.fruitstore.domain.FruitItem;
import cn.itcast.fruitstore.service.AdminService;
import cn.itcast.fruitstore.view.AbstractAdminDialog;
/**
 * 管理员界面操作类
 */
@SuppressWarnings("serial")
public class AdminDialogController extends AbstractAdminDialog {
	//定义服务类,提供完整功能服务
	private AdminService adminService = new AdminService();	
	//构造方法
	public AdminDialogController() {
		super();
	}
	public AdminDialogController(Frame owner, boolean modal) {
		super(owner, modal);
		//创建对象时展示数据
		queryFruitItem();
	}	
	//查询方法
	@Override
	public void queryFruitItem() {
		//定义表格头
		String[] thead = {"水果编号","水果名称","水果单价(/元)","计价单位"};
		
		//调用adminService的查询服务
		ArrayList<FruitItem> dataList = adminService.queryFruitItem();
		//调用list2Array方法,将查询到的集合转为数组,方便为JTable赋值
		String[][] tbody = list2Array(dataList);
		//将查询到的结果为table赋值
		TableModel dataModel = new DefaultTableModel(tbody, thead);
		table.setModel(dataModel);
	}
	//集合数据转为二维数组方法
	public String[][] list2Array(ArrayList<FruitItem> list){		
		//根据FruitItem的model与集合数据定义JTable的数据二维数组
		String[][] tbody = new String[list.size()][4];	
		for (int i = 0; i < list.size(); i++) {
			FruitItem fruitItem = list.get(i);
			tbody[i][0] = fruitItem.getNumber();
			tbody[i][1] = fruitItem.getName();
			tbody[i][2] = fruitItem.getPrice()+"";
			tbody[i][3] = fruitItem.getUnit();
		}		
		return tbody;
	}
	//添加方法
	@Override
	public void addFruitItem() {
		//获取数据
		String addNumber = addNumberText.getText();
		String addName = addNameText.getText();
		String addPrice = addPriceText.getText();
		String addUnit = addUnitText.getText();
		//调用adminService的添加服务
		boolean addSuccess = adminService.addFruitItem(addNumber, addName,
				addPrice, addUnit);
		//如果添加成功
		if(addSuccess) {
			//添加后刷新表格
			queryFruitItem();
		}else {
			//没有添加成功弹窗错误提示
			JOptionPane.showMessageDialog(this, "水果编号不能重复,请检查数据!");
		}
	}
	//修改方法
	@Override
	public void updateFruitItem() {		
		//获取数据
		String updateNumber = updateNumberText.getText();
		String updateName = updateNameText.getText();
		String updatePrice = updatePriceText.getText();
		String updateUnit = updateUnitText.getText();
		//调用adminService的修改服务
		boolean updateSuccess = adminService.updateFruitItem(updateNumber,
				updateName, updatePrice, updateUnit);		
		//如果修改成功
		if(updateSuccess) {
			//修改后刷新表格
			queryFruitItem();
		}else {
			//没有修改成功弹窗错误提示
			JOptionPane.showMessageDialog(this, "没有这个编号的水果,请检查数据!");
		}
	}
	//删除方法
	@Override
	public void delFruitItem() {		
		//获取数据
		String delNumber = delNumberText.getText();
		//调用adminService的删除服务
		boolean delSuccess = adminService.delFruitItem(delNumber);		
		//如果删除成功
		if(delSuccess) {
			//删除后刷新表格
			queryFruitItem();
		}else {
			//没有删除成功弹窗错误提示
			JOptionPane.showMessageDialog(this, "没有这个编号的水果,请检查数据!");
		}
	}	
}

主界面操作类

package cn.itcast.fruitstore.controller;
import cn.itcast.fruitstore.view.AbstractMainFrame;
/**
 * 主界面操作类
 */
@SuppressWarnings("serial")
public class MainFrameController extends AbstractMainFrame {
	@Override
	public void showAdminDialog() {
		//在该方法中创建管理员界面并显示
		//this为父窗口(主界面)  true:设置为模态窗口展示
		new AdminDialogController(this, true).setVisible(true);
	}
}

进行所有的方法窗体构造后进行只要调用app的main函数运行

package cn.itcast.fruitstore.app;
import cn.itcast.fruitstore.controller.MainFrameController;
/**
 * 项目运行
 */
public class MainApp {
	public static void main(String[] args) {		
		new MainFrameController().setVisible(true);
	}
}

最后报一张实现只后的效果
在这里插入图片描述

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值