赞
踩
水果超市管理系统包括两个界面:系统欢迎界面和超市货物管理界面,在系统欢迎界面中,通过单击“进入系统”按钮,进入超市货物管理界面。在超市货物管理界面中,可以对水果信息实现具体的操作。例如,每当有新水果运送到超市时,就需要系统管理人员在系统中增加新水果的信息;若超市中的某种水果售罄,则删除该水果的信息;若水果的数量、价格等需要变更,则及时进行修改。这些操作都可以在水果超市管理系统中完成。
案例目标: 实现添加数据、修改数据和删除数据的功能。
运行环境: Jdk、Eclipse
首先,我们需要按照以下形式在Eclipse中创建相应的包和类。
先创建一个工程"fruitstore",下面开始就是代码了。
(1)先创建cn.example.fruitstore.app包,在此包下创建MainApp.java类。
- package cn.example.fruitstore.app;
- import cn.example.fruitstore.controller.MainFrameController;
- /**
- * 项目运行
- */
- public class MainApp {
- public static void main(String[] args) {
- new MainFrameController().setVisible(true);
- }
- }
(2)先创建cn.example.fruitstore.controller包,在此包下创建AdminDialogController.java类和MainFrameController.java类。
- //AdminDialogController.java类代码如下
- package cn.example.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.example.fruitstore.domain.FruitItem;
- import cn.example.fruitstore.service.AdminService;
- import cn.example.fruitstore.view.AbstractSdminDialog;
- /**
- * 管理员界面操作类*/
- @SuppressWarnings("serial")
- public class AdminDialogController extends AbstractSdminDialog{
- //定义服务类,提供完整功能服务
- 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){
- //根据EruitItem类的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,"没有这个编号的水果,请检查数据! ");
- }
- }
- }
- //MainFrameController.java类代码如下
- package cn.example.fruitstore.controller;
- import cn.example.fruitstore.view.AbstractMainFrame;
- /**
- *主界面操作类
- */
- @SuppressWarnings("serial")
- public class MainFrameController extends AbstractMainFrame {
- @Override
- public void showAdminDialog(){
- //在该方法中创建管理员界面并显示
- // this为父窗体(主界面),true表示设置为模态窗体展示
- new AdminDialogController(this, true).setVisible(true);
- }
- }
(3)先创建cn.example.fruitstore.dao包,在此包下创建AdminDao.java类。
- package cn.example.fruitstore.dao;
- import java.util.ArrayList;
- import cn.example.fruitstore.data.DataBase;
- import cn.example.fruitstore.domain.FruitItem;
- /*
- *管理员数据访问类
- */
- 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);
- }
- }
- }
- }
(4)先创建cn.example.fruitstore.data包,在此包下创建DataBase.java类。
- package cn.example.fruitstore.data;
- import java.util.ArrayList;
- import cn.example.fruitstore.domain.FruitItem;
- /**
- * 存储数据
- */
- public class DataBase{
- public static ArrayList<FruitItem> data = new ArrayList<FruitItem>();
- //初始数据
- static{
- data.add(new FruitItem("1","苹果",5.0,"kg"));
- }
- }
(5)先创建cn.example.fruitstore.domain包,在此包下创建FruitItem.java类。
- package cn.example.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;
- }
- // getter和 setter方法
- 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;
- }
- }
-
(6)先创建cn.example.fruitstore.service包,在此包下创建AdminService.java类。
- package cn.example.fruitstore.service;
- import java.util.ArrayList;
- import cn.example.fruitstore.dao.AdminDao;
- import cn.example.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;
- }
- }
(7)先创建cn.example.fruitstore.test包,在此包下创建AbstractAdminDialogTest.java类和AbstractMainFrameTest.java类。
- //AbstractAdminDialogTest.java类代码如下
- package cn.example.fruitstore.test;
- import javax.swing.table.DefaultTableModel;
- import javax.swing.table.TableModel;
- import cn.example.fruitstore.view.AbstractSdminDialog;
- /*管理界面测试类*/
- @SuppressWarnings("serial")
- public class AbstractAdminDialogTest extends AbstractSdminDialog{
- //定义构造方法初始化数据
- 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);
- }
- }
- //AbstractMainFrameTest.java类代码如下
- package cn.example.fruitstore.test;
- import cn.example.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("进入管理界面");
- }
- }
(8)先创建cn.example.fruitstore.tools包,在此包下创建GUITools.java类。
- package cn.example.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));
- }
- }
(9)先创建cn.example.fruitstore.view包,在此包下创建AbstractMainFrame.java类和AbstractSdminDialog.java类。然后我们需要在src所在的文件夹内存入一个“Fruaitstore.jpg”(任意图片都行,但是敲黑板:必须把“Fruaitstore.jpg”存放在src所在文件夹内,否则图片不会运行出来!)
我就把“FruitStore.jpg”放在了这里:
下面是AbstractMainFrame.java类和AbstractSdminDialog.java类的代码:
- //AbstractMainFrame.java类代码如下
- package cn.example.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.example.fruitstore.tools.GUITools;
- /**
- *主窗体类
- */
- @SuppressWarnings ("serial")
- public abstract class AbstractMainFrame extends JFrame{//组件
- private JLabel titleLabel = new JLabel(new ImageIcon("Fruaitstore.jpg"));//标题图片
- private JButton btn = new JButton("进入系统");//按钮
- //构造方法
- public AbstractMainFrame(){
- this.init ();
- this.addComponent();//添加组件
- this.addListener();//添加监听器
- }
- //初始化操作
- private void init(){
- this.setTitle("水果超市欢迎您!");
- this.setSize(600,400);//窗体大小与位置
- this.setResizable(true);//窗体大小不固定
- 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();
- }
- //AbstractSdminDialog.java类代码如下
- 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.example.fruitstore.tools.GUITools;
- /*管理窗体类
- */
- @SuppressWarnings("serial")
- public abstract class AbstractSdminDialog 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 AbstractSdminDialog(){
- this(null,true);
- }
- public AbstractSdminDialog (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();
- }
首先,我们运行cn.example.fruitstore.app包下的MainApp.java类文件,再将窗口左右上下拉大后会看到如下画面:
点击【进入系统】后,出现如下画面(这里画面的关于苹果的数据是我们编码时输入的,也就是系统默认的数据):
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。