前面完成了界面的基本布局,接下来实现把输入框的文字保存到文件中,和进货、清空的功能。
进货开销、货款余额、进货日期为自动计算后输入。

创建三个文件,分别用于保存进货销货的数据文件、商品名称和数量文件和剩余总资金的文件。
这个三个文件充当着数据库的作用,以便保存数据和以后的使用这些数据。
实例化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();
- }
- }
第一个文件:保存进货数据

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

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

增加点击事件,判断进货名称、厂家、价格、数量、操作人不能为空,如果为空则提醒并返回。
构造方法增加点击事件
为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,然后在有进货价格和数量的条件下,获取进货价格与数量,两者相乘就是进货的总金额,如果余额足够就自动输入到输入框。
构造方法增加
在进货时,需要判断自己的资金是否够进货条件,需要先拿到自己的资金。
使用高级流读取文件内容,好处是可以每次读取文件一行数据,也就是一条数据;
读取到文件内容后,将字符串类型转换为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();
- }
先计算进货后剩余的总资金,如果资金为负数则提示,为正数则自动输入到货款余额中并刷新保存到文件。
构造方法中的进货开销异常中增加
计算得到本次进货后剩余的总资金;
如果还有剩余资金,则输入到货款余额输入框中,并保存到文件中,
如果没有剩余,则表示本次进货资金准备不充足,不能进货,提示并返回。
- 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();
- }
构造方法中增加
- SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");//设置时间格式
- Date date = new Date();//获取当前时间
- String dateNow = format.format(date);//按照格式设置时间
- getField8().setText(dateNow);//写入到输入框
首先读取文件:用集合把以前的文件记录保存,先在集合中添加最新的记录;
然后写入文件:用迭代器把集合中的记录取出,把文件清空,再全部写入。
构造方法增加
先用集合保存原文件的所有内容。
- try {//保存货物进销记录
- FileReader fr = new FileReader(file);
- BufferedReader br = new BufferedReader(fr);
- List<String> list = new ArrayList<String>();//存放进销信息的集合
- 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<String> 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();
- }
先读取文件,存入集合,对比商品,如果是新商品,则添加到集合;
写入文件,先清空原文件,再将集合的所有元素都写入文件。
读取文件内容,将原文件所有内容放入集合;
再判断原文件有无新商品的情况,生成新的记录放入集合;
最后将集合的所有元素保存进文件中。
构造方法增加
如果文件的内容为空,则写入无商品。
- 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<String> list=new ArrayList<String>();
- 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<String> 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。
构造方法增加
还是先从文件中拿到所有的内容添加到集合中。
- try{//合并商品数量
- FileReader fr=new FileReader(file1);
- BufferedReader br=new BufferedReader(fr);
- List<String> list=new ArrayList<String>();
- 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<String> 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();
- }
构造方法增加
- 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的商品并在集合中移除,最后将文件清空,将修改后的集合保存进文件。
构造方法增加
还是获取原文件全部内容,添加到集合中。
- try{
- FileReader fr=new FileReader(file1);
- BufferedReader br=new BufferedReader(fr);
- List<String> list=new ArrayList<String>();
- 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<String> 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();
- }
构造方法增加
- 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("");
- }
- });
至此,“增加内容”功能已经完成,还有三个功能待完成。