栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【JAVA】-- 简易超市管理系统窗口(三)(实现思路+每步代码)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【JAVA】-- 简易超市管理系统窗口(三)(实现思路+每步代码)

前面完成了界面的基本布局,接下来实现把输入框的文字保存到文件中,和进货、清空的功能。

进货开销、货款余额、进货日期为自动计算后输入。

一、创建保存数据的文件

创建三个文件,分别用于保存进货销货的数据文件、商品名称和数量文件和剩余总资金的文件。

这个三个文件充当着数据库的作用,以便保存数据和以后的使用这些数据。

Zeng类增加

实例化File类对象,如果文件不存在则创建文件。(一般情况第一次使用都不存在)

    File file,file1,file2;//三个文件分别为:进货数据文件、商品记录文件、总余额文件

构造方法增加

 
        file = new File("E:\大二\下\JAVA\JAVA课程\专题训练\超市管理系统\sava_date.txt");
        if(!file.exists()){//判断文件是否为空,首次运行文件为空
            try {
                file.createNewFile();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        file1 = new File("E:\大二\下\JAVA\JAVA课程\专题训练\超市管理系统\sava_member.txt");
        if(!file1.exists()){
            try {
                file1.createNewFile();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        file2 = new File("E:\大二\下\JAVA\JAVA课程\专题训练\超市管理系统\sava_money.txt");
        if(!file2.exists()){
            try {
                file2.createNewFile();
            }catch (Exception e){
                e.printStackTrace();
            }
        }

第一个文件:保存进货数据

 第二个文件:保存商品信息文件

 第三个文件:保存剩余总资金文件

 

二、增加“进货”按钮点击事件

增加点击事件,判断进货名称、厂家、价格、数量、操作人不能为空,如果为空则提醒并返回。

Zeng类增加

构造方法增加点击事件

为button1增加点击事件,获取到输入框的内容判断是否为空,null和queals(“”)都表示为空,但是null表示无内存空间,后者为无内容。

        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(getField1().getText() == null || getField1().getText().equals("")){
                    JOptionPane.showMessageDialog(null,"商品名称不可为空");
                    return;
                }
                if(getField2().getText() == null || getField2().getText().equals("")){
                    JOptionPane.showMessageDialog(null,"商品厂家不可为空");
                    return;
                }
                if(getField3().getText()==null||getField3().getText().equals("")){
                    JOptionPane.showMessageDialog(null,
                            "进货价格不可为空");
                    return; //该处内容不能为空
                }
                if(getField4().getText()==null||getField4().getText().equals("")){
                    JOptionPane.showMessageDialog(null,
                            "进货数量不可为空");
                    return; //该处内容不能为空
                }
                if(getField7().getText()==null||getField7().getText().equals("")){
                    JOptionPane.showMessageDialog(null,
                            "经办人不可为空");
                    return;
                }


            }
        });
三、“进货开销”:根据进货价格与数量自动输入

先从保存资金的文件中读取余额资金,没有内容就直接赋值30000,然后在有进货价格和数量的条件下,获取进货价格与数量,两者相乘就是进货的总金额,如果余额足够就自动输入到输入框。

Zeng类增加

构造方法增加

在进货时,需要判断自己的资金是否够进货条件,需要先拿到自己的资金。

使用高级流读取文件内容,好处是可以每次读取文件一行数据,也就是一条数据;

读取到文件内容后,将字符串类型转换为Double类型,注意这里没有用循环而是条件,因为文件只有一行数据,

如果没有读取到内容,则直接给一个默认值30000,就当是贷款了先欠着(O(∩_∩)O)。

 String expenseStr = null;//进货开销
                try {
                    FileReader fr = new FileReader(file2);//读取资金文件
                    BufferedReader br = new BufferedReader(fr);//高级流,可以每次读取TXT文件的一行,每次读取一条数据
                    String str;
                    double totalMoney = 0;//剩余可用资金
                    if((str = br.readLine()) != null){//读取文件内容
                        totalMoney = Double.parseDouble(str);
                    }else{
                        totalMoney = 30000;//没有读取到内容,就直接赋值30000
                    }

                   

接下来获取商品单价与数量的输入框内容,不为空时进行下一步;

拿到输入框的内容是字符串类型,需要先转换为Double类型;

商品数量与单价相乘就是这次的花费总金额,需要判断余额资金是否够本次花费,

如果够,则在输入框上自动输入,

如果不够,则提醒并返回。

 if(getField3().getText()!=null&&getField4().getText()!=null){
                        String priceStr = getField3().getText();
                        double price = Double.parseDouble(priceStr);
                        String memberStr = getField4().getText();
                        double member = Double.parseDouble(memberStr);
                        double result = price*member;//本次共花费金额
                        if(result > totalMoney){//进货金额不能大于剩余的金额
                            getField4().setText("");
                            JOptionPane.showMessageDialog(null,"余额不足");
                            return;
                        }else{//余额足够就设置进货开销
                            getField5().setText(String.format("%.2f",result));//余额保留三位小数
                        }
                    }
                }catch (Exception e1){
                        e1.printStackTrace();
                }
四、计算剩余总资金保存到文件并输入到货款余额

先计算进货后剩余的总资金,如果资金为负数则提示,为正数则自动输入到货款余额中并刷新保存到文件。

Zeng类增加

构造方法中的进货开销异常中增加

计算得到本次进货后剩余的总资金;

如果还有剩余资金,则输入到货款余额输入框中,并保存到文件中,

如果没有剩余,则表示本次进货资金准备不充足,不能进货,提示并返回。

expenseStr = getField5().getText();//获取到进货开销后,计算总资金余额,并保存文件
                    double expense = Double.parseDouble(expenseStr);//本次花费
                    double surplus = totalMoney - expense;//本次进货后剩余资金
                    if(surplus >=0){//如果本次还剩余了钱,输入到输入框
                        getField6().setText(String.format("%.2f",surplus));
                        try {//将剩余金额保存到文件中
                            FileWriter fw = new FileWriter(file2);
                            BufferedWriter bw = new BufferedWriter(fw);
                            bw.write(String.valueOf(surplus));//valueOf是将其他类型转换为字符串类型
                            bw.close();
                            fw.close();
                        }catch (Exception e1){
                            e1.printStackTrace();
                        }
                    }
                    else{//如果没有剩余资金,提示
                        JOptionPane.showMessageDialog(null,"货款余额不可为负数");
                        return;
                    }
                    br.close();
                    fr.close();
                }catch (Exception e1){
                        e1.printStackTrace();
                }
五、设置进货日期 Zeng类增加

构造方法中增加

SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");//设置时间格式
                Date date = new Date();//获取当前时间
                String dateNow = format.format(date);//按照格式设置时间
                getField8().setText(dateNow);//写入到输入框
六、进货记录写入文件

首先读取文件:用集合把以前的文件记录保存,先在集合中添加最新的记录;

然后写入文件:用迭代器把集合中的记录取出,把文件清空,再全部写入。

Zeng类增加

构造方法增加

先用集合保存原文件的所有内容。

 try {//保存货物进销记录
                    FileReader fr = new FileReader(file);
                    BufferedReader br = new BufferedReader(fr);
                    List list = new ArrayList();//存放进销信息的集合
                    String str = null;
                    while ((str = br.readLine()) != null){
                        list.add(str);
                    }
                   

 然后再把新信息字符串的格式拼接好增加到集合中

 int line = list.size();//用于获取集合中元素的数量
                    String nameStr=",货物名称:"+getField1().getText();
                    String makerStr=",货物厂家:"+getField2().getText();
                    String priceStr=",货物价格:"+getField3().getText();
                    String memberStr=",货物数量:"+getField4().getText();
                    expenseStr=",货物开销:"+expenseStr;
                    String surplusStr=",货款余额:"+getField6().getText();
                    String operatorStr=",经办人:"+getField7().getText();
                    String dateStr=",进货日期:"+getField8().getText();
                    String finStr="单号:"+getField8().getText()+"#"+ i++
                            +nameStr+makerStr+priceStr+memberStr+expenseStr+
                            surplusStr+operatorStr+dateStr;
                    list.add(line,finStr);//将新信息添加到集合
                   

最后把文件的原内容都清空,把当前新的集合用迭代器写入文件。

 FileWriter fw = new FileWriter(file);
                    BufferedWriter bw = new BufferedWriter(fw);
                    bw.write("");//将原来的内容清空,重新写入
                    FileWriter fw1 = new FileWriter(file,true);//true表示每次写入的内容可以叠加不会被覆盖
                    BufferedWriter bw1 = new BufferedWriter(fw1);
                    Iterator it = list.iterator();//用迭代器获取集合中的元素
                    while (it.hasNext()){
                        String value = it.next();
                        bw1.write(value);
                        bw1.newLine();//换行
                    }
                    bw.close();
                    fw.close();
                    bw1.close();
                    fw1.close();
                    br.close();
                    fr.close();
                }catch(Exception e1){
                    e1.printStackTrace();
                }
七、商品名称、商品数量写入文件

先读取文件,存入集合,对比商品,如果是新商品,则添加到集合;

写入文件,先清空原文件,再将集合的所有元素都写入文件。

Zeng类增加

读取文件内容,将原文件所有内容放入集合;

再判断原文件有无新商品的情况,生成新的记录放入集合;

最后将集合的所有元素保存进文件中。

构造方法增加

如果文件的内容为空,则写入无商品。

try{
          if(file1.length()==0){ //file1表示商品剩余数量文件
            try{
              FileWriter fw=new FileWriter(file1);
              BufferedWriter bw=new BufferedWriter(fw);
              bw.write("商品名称:无商品数量:0;n");//初始内容
              bw.close();
              fw.close();
            }catch(Exception e1){
              e1.printStackTrace();
            }
          }
          

读取文件内容,将文件所有内容存入集合

FileReader fr=new FileReader(file1);
          BufferedReader br=new BufferedReader(fr);
          String str;
          List list=new ArrayList();
          while((str=br.readLine())!=null){
            list.add(str);//将原有内容存入集合
          }
         

再次读取文件,如果文件不为空,则获取的商品的名称,“商品名称”出现的位置一般是0下标,从再+5下标开始,+5是“商品名称:”这5个字符,到“商品数量”出现的位置结束;

判断文件第一行的商品名称是否与本次输入框中的商品名称相同,(为什么和第一行内容比较,后面有方法将多余的相同商品名称的数量合并),

不相同则生成一条新的记录,将记录添加到集合。

 FileReader fr1=new FileReader(file1);
          BufferedReader br1=new BufferedReader(fr1);
          String str1;//保存文件中上一次进货的商品名称和数量
          int line=list.size();//获取记录条目数量
          if((str1=br1.readLine())!=null){
            int indexCommodity=str1.indexOf("商品名称");
            int indexMember=str1.indexOf("商品数量");
            String nameCommodity=str1.substring(
                indexCommodity+5, indexMember);//获取商品名称
            if(!nameCommodity.equals(getField1().getText())){
              String result="商品名称:"+getField1().getText()+
                  "商品数量:"+getField4().getText()+";";
              //如果商品是原来没有的,则生成一条新的记录
              list.add(line, result);//将新的记录加入集合
            }
          }
         

将原文件清空,将新集合写入到文件中。

 FileWriter fw=new FileWriter(file1);
          BufferedWriter bw=new BufferedWriter(fw);
          bw.write("");
          FileWriter fw1=new FileWriter(file1, true);
          BufferedWriter bw1=new BufferedWriter(fw1);
          Iterator it=list.iterator();
          while(it.hasNext()){
            String value=it.next();
            bw1.write(value);//将新的商品剩余数量记录写入文件
            bw1.newLine();
          }
          bw.close();
          fw.close();
          bw1.close();
          fw1.close();
          br1.close();
          fr1.close();
          br.close();
          fr.close();
        }catch(Exception e1){
          e1.printStackTrace();
        }
八、同一商品数量合并

将同一商品名称但是数量不同的记录合并,将原来多条记录中序号最小的记录修改为合并后的数量,但是将其余的记录中的数量修改为0。

Zeng类增加

构造方法增加

还是先从文件中拿到所有的内容添加到集合中。

        try{//合并商品数量
          FileReader fr=new FileReader(file1);
          BufferedReader br=new BufferedReader(fr);
          List list=new ArrayList();
          String str;
          while((str=br.readLine())!=null){
            list.add(str);//现将原始数据提取并保存
          }
         

使用双循环拿到前一个和后一个商品的名称,iValue是前一个商品,jValue是下一个商品。

 int line=list.size();//获取数据数量
          for(int i=0;i<=line-2;i++){
            for(int j=i+1;j<=line-1;j++){
              String iStr=list.get(i);
              int index1=iStr.indexOf("商品数量");
              String iValue=iStr.substring(5, index1);
              String jStr=list.get(j);
              int index2=jStr.indexOf("商品数量");
              String jValue=jStr.substring(5, index2);
             

然后判断前后商品名称是否相同,是同一商品则拿到前后商品的商品数量。

 if(iValue.equals(jValue)){
                int start1=iStr.indexOf("商品数量");
                int end1=iStr.indexOf(";");
                String value1=iStr.substring(start1+5, end1);
                int iMember=Integer.parseInt(value1);
                int start2=jStr.indexOf("商品数量");
                int end2=jStr.indexOf(";");
                String value2=jStr.substring(start2+5, end2);
                int jMember=Integer.parseInt(value2);
               

将两商品数量相加,然后将前一个商品(即序号小的)设置为合并后的数量,

后一商品设置为0,后面方法中删除。

 int totalMember=iMember+jMember;
                list.set(i, "商品名称:"+iValue+"商品数量:"
                    +String.valueOf(totalMember)+";");
                list.set(j, "商品名称:"+iValue+"商品数量:"
                    +String.valueOf(0)+";");
               

最后文件清空,将新集合写入文件。

 FileWriter fw=new FileWriter(file1);
                BufferedWriter bw=new BufferedWriter(fw);
                bw.write("");
                FileWriter fw1=new FileWriter(file1, true);
                BufferedWriter bw1=new BufferedWriter(fw1);
                Iterator it=list.iterator();
                while(it.hasNext()){
                  String value=it.next();
                  bw1.write(value);
                  bw1.newLine();
                }
                bw.close();
                fw.close();
                bw1.close();
                fw1.close();
                br.close();
                fr.close();
              }
            }
          }
        }catch(Exception e1){
          e1.printStackTrace();
        }
九、货款余额写入文件 Zeng类增加

构造方法增加

try{
          FileWriter fw=new FileWriter(file2);
          BufferedWriter bw=new BufferedWriter(fw);
          bw.write(getField6().getText());//货款余额写入文件
          bw.close();
          fw.close();
        }catch(Exception e1){
          e1.printStackTrace();
        }
十、删除保存商品数量文件中的废弃记录

将前面合并后商品数量为0的废弃记录删除,先用集合将文件里的内容保存,然后遍历集合,找到商品数量为0的商品并在集合中移除,最后将文件清空,将修改后的集合保存进文件。

Zeng类增加

构造方法增加

还是获取原文件全部内容,添加到集合中。

        try{
          FileReader fr=new FileReader(file1);
          BufferedReader br=new BufferedReader(fr);
          List list=new ArrayList();
          String str;
          while((str=br.readLine())!=null){
            list.add(str);
          }//到此处的作用是保存原有文件的内容至一个集合
         

 将集合中的元素取出,依次判断数量是否为0

 String str1;
          int i=1;
          int line=list.size();//获取集合行数
          while((str1=list.get(i))!=null){
            int start=str1.indexOf("商品数量");
            int end=str1.indexOf(";");
            String value=str1.substring(start+5, end);

            if(value.equals("0")){
              list.remove(i);
              line-=1;
            }//寻找file1文件中数量为0的废弃记录,并删除
            if(i<=line-2){
              i++;//如果没有到达最后一行,就顺序遍历
            }else{
              break;
            }
          }
        

最后将新集合写入文件。

  FileWriter fw=new FileWriter(file1);
          BufferedWriter bw=new BufferedWriter(fw);
          bw.write("");
          FileWriter fw1=new FileWriter(file1, true);
          BufferedWriter bw1=new BufferedWriter(fw1);
          Iterator it=list.iterator();
          while(it.hasNext()){
            String value=it.next();
            bw1.write(value);
            bw1.newLine();
          }
          bw.close();
          fw.close();
          bw1.close();
          fw1.close();
          br.close();
          fr.close();
        }catch(Exception e1){
          e1.printStackTrace();
        }
十一、“清空”按钮增加点击事件 Zeng类增加

构造方法增加

button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                getField1().setText("");
                getField2().setText("");
                getField3().setText("");
                getField4().setText("");
                getField5().setText("");
                getField6().setText("");
                getField7().setText("");
                getField8().setText("");
            }
        });

至此,“增加内容”功能已经完成,还有三个功能待完成。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/987945.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号