目录
背景
显示效果
新增知识内容
下拉列表
读取数据
存储数据
关闭程序
如何将用java写的代码变成exe文件
拓展提高
背景
本文是的进阶版主要讲解如何用IO流读取并保存数据,若有基础问题不懂请参考基础抽奖,基础版链接:https://blog.csdn.net/weixin_52473454/article/details/121520004
显示效果
新增知识内容
知识内容 | 作用目的 | JComboBox | 下拉列表显示信息 | File | 实例化文件对象 | FileInputStream,FileOutputStream | 用于以字节的形式读取和写入数据 | DataInputStream,DataOutputStream | 直接进行字符的读写 | System.exit(EXIT_ON_CLOSE) | 关闭程序 |
下拉列表
下拉列表属于GUI中基础的组件,在这里不多介绍。
实例化下拉列表并给下拉列表添加内容。
String prize[]= {"奖品","过期牛奶一箱","二手牙刷一个","小编秘制奥利给一份","雷碧一瓶","并夕夕优惠券",
"半瓶开塞露","逍遥丸一粒","一袋旺仔牛逼糖","爆炒啤酒瓶一份"};//奖品信息
JComboBox<Object> jcb=new JComboBox<Object>(prize);//下拉列表组件
读取数据
我们判断id是否使用的前提是我们得先将以前抽过奖的id拿出来,然后再与从文本框中获取的id作比较,然后得出结果。
try {//读取数据
fis=new FileInputStream(f1);
dis=new DataInputStream(fis);
String str1;
try {
str1 = dis.readUTF();
String str2[]=str1.split(",");//通过","号还分割成字符串数组
for(int i=0;i<str2.length;i++) {
list.add(str2[i]); //将数组内容赋值到list中
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {//关闭流,从下到上
dis.close();
fis.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
存储数据
当我们抽完奖后得保存这几次抽奖的id,防止已抽奖的id在下次运行程序时还能抽奖。
try {
String str3=list.get(0);
for(int i=1;i<list.size();i++) {
str3+= (","+list.get(i));//将id保存
}
FileOutputStream fos=new FileOutputStream(f1);
DataOutputStream dos=new DataOutputStream(fos);//通过数据流把数据保存到txt文档中
try {
dos.writeUTF(str3);
} catch (IOException e1) {
e1.printStackTrace();
}
try {
dos.close();
fos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
System.exit(EXIT_ON_CLOSE);
}
关闭程序
关闭程序,我更喜欢用System.exit(EXIT_ON_CLOSE)方法,System.exit()停止虚拟机 而dispose()只是关闭这个窗口,但是并没有停止整个application。 exit方法会释放内存,也就是说连JVM都关闭了。
全部代码
为了方便复制并运行,我直接把所有内容写到一个类里。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Frame extends JFrame{
/**
* @author ZYY
*/
private static final long serialVersionUID = 1L;
public List<String> list=new ArrayList<String>();
public File f0=new File("d:/机密/文本文档");//创建一个文件对象,用于创建一个文件夹
public File f1=new File("d:/机密/文本文档/id内容.txt");//创建一个文本文档
public String prize[]= {"奖品","过期牛奶一箱","二手牙刷一个","小编秘制奥利给一份","雷碧一瓶","并夕夕优惠券",
"半瓶开塞露","逍遥丸一粒","一袋旺仔牛逼糖","爆炒啤酒瓶一份"};//奖品信息
FileInputStream fis;//字节流
DataInputStream dis;//用数据流封装字节流,通过数据流读取数据
public Frame() {
f0.mkdirs();//如果没有该文件夹,创建该目录的所有文件夹
if(!f1.exists()) {//如果不存在该txt文档,创建该txt文档
try {
f1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {//读取数据
fis=new FileInputStream(f1);
dis=new DataInputStream(fis);
String str1;
try {
str1 = dis.readUTF();
String str2[]=str1.split(",");//通过","号还分割成字符串数组
for(int i=0;i<str2.length;i++) {
list.add(str2[i]); //将数组内容赋值到list中
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {//关闭流,从下到上
dis.close();
fis.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//界面部分
JLabel l1=new JLabel("通过IO流保存数据");//标签组件
JLabel l2=new JLabel("请输入您的id:");
JLabel l3=new JLabel("");
JLabel l4=new JLabel("查看奖品:");
JLabel l5=new JLabel("");
JLabel l6=new JLabel("查看中奖名单:");
JButton b1=new JButton("开始抽奖");//按钮组件
JButton b2=new JButton("查看奖品");
JButton b3=new JButton("退出");
JTextField jtf=new JTextField();//文本框组件
JComboBox<Object> jcb=new JComboBox<Object>(prize);//下拉列表组件
String ps[]=new String [list.size()+1];//下拉列表内容
ps[0]="id";//给第一个命名
for(int i=1;i<ps.length;i++) {
ps[i]=list.get(i-1);//给剩下的命名
}
JComboBox<Object> cb=new JComboBox<Object>(ps);
jtf.setColumns(20);//设置文本框内容长度
l1.setBounds(120,20,300,50);//绝对坐标,大小
l1.setFont(new Font("宋体",Font.BOLD,26));//样式
l2.setBounds(10,320,110,30);
l2.setFont(new Font("宋体",Font.BOLD,15));
l3.setFont(new Font("宋体",Font.BOLD,15));
l5.setFont(new Font("宋体",Font.BOLD,13));
l3.setBounds(150,100,170,30);
l4.setBounds(350,70,100,30);
l5.setBounds(150,130,170,30);
l6.setBounds(350,130,100,30);
jtf.setBounds(130,320,120,30);
b1.setBounds(260,320,90,30);
b3.setBounds(355,320,70,30);
jcb.setBounds(350,100,130,30);
cb.setBounds(350,155,130,30);
add(l1);//将组件加入到窗体里
add(l2);
add(l3);
add(l4);
add(l5);
add(l6);
add(b1);
add(b2);
add(b3);
add(jtf);
add(jcb);
add(cb);
setBounds(320, 200, 500, 400);//设置窗体的坐标大小
setUndecorated(true);//是否消除窗体边框
setLayout(null);//绝对布局
setVisible(true);//是否显示
b1.addActionListener(new ActionListener() {//添加监听
@Override
public void actionPerformed(ActionEvent e) {
if(list.contains(jtf.getText())) {//判断是否存在该id
l3.setText("该id已参与抽奖!");
l3.setForeground(Color.RED);//前景色
}else {
list.add(jtf.getText());
l3.setText("您已成功参与抽奖!");
l3.setForeground(Color.GREEN);
Random r=new Random();//随机奖品
int num=r.nextInt(prize.length)+1;
String p=prize[num];
l5.setText("恭喜您获得"+p);
}
}
});
b3.addActionListener(new ActionListener() {//用于保存抽奖的id
public void actionPerformed(ActionEvent e) {
try {
String str3=list.get(0);
for(int i=1;i<list.size();i++) {
str3+= (","+list.get(i));//将id保存
}
FileOutputStream fos=new FileOutputStream(f1);
DataOutputStream dos=new DataOutputStream(fos);//通过数据流把数据保存到txt文档中
try {
dos.writeUTF(str3);
} catch (IOException e1) {
e1.printStackTrace();
}
try {
dos.close();
fos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
System.exit(EXIT_ON_CLOSE);
}
});
}
public static void main(String[] args) {
new Frame(); //调用构造方法
}
}
如何将用java写的代码变成exe文件
参考:
如何将JAVA程序制作成可以直接执行的exe文件_m0_38100471的博客-CSDN博客_java.exe
拓展提高
除了本项目中用io保存已参与抽奖的id,还可以对id进行限制。如格式为abc123d45类型的才可以参与抽奖,否则提示“id无效”。可以设置中奖概率,使一些id不能百分百中奖,使一些vip-id可以百分百中奖。可以美化一下窗体布局,设置一些背景图片,添加一些高级组件。还可以在另一个文档里读取,保存奖品数据。
|