前面完成了界面的基本布局,接下来实现把输入框的文字保存到文件中,和进货、清空的功能。
进货开销、货款余额、进货日期为自动计算后输入。
一、创建保存数据的文件创建三个文件,分别用于保存进货销货的数据文件、商品名称和数量文件和剩余总资金的文件。
这个三个文件充当着数据库的作用,以便保存数据和以后的使用这些数据。
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("");
}
});
至此,“增加内容”功能已经完成,还有三个功能待完成。



