本程序实现在图形界面上对食物随机抽取。需要定义一个数组存放食物,再创建一个窗体,放置面板后,在面板里面添加一个显示食物的文本框,并且放入两个按钮,一个用来启动程序,一个进行截取。当点击启动按钮后,文本框的食物进行不断地翻滚,点击截取按钮,文本框停止截取,截取到的食物显示在屏幕上,并且在一个指定路径里立即创建一个文件来存放抽取的数据,以时间加上食物名称保存。
首先定义数组和窗体,面板和组件。定义的代码如下。
//窗口
private JFrame randomFrame = new JFrame();
// 创建一个Panel对象
private JPanel randomPanel = new JPanel();
/启动抽取按钮/
private JButton btnStart = new JButton(“启动抽取”);
/启动截取按钮/
private JButton btnCancel = new JButton(“截取食物”);
//文本框
private TextField tf = new TextField(30);
/文本提示控件/
private JLabel tips = new JLabel(“启动抽取食物!”);
/文本提示控件/
private JLabel tips2 = new JLabel(“这里放入抽取结果!”);
//放入食物
private String[] name = { “包子”, “水煮面”, “蛋炒饭”, “水煮鱼”, “鸡排饭”, “凉粉”, “寿司”, “小炒菜”, “火锅”, “热干面” };
然后设置窗体,添加按钮组件等组成一个界面。为了实现按钮的作用,需要在主方法中使用接口ActionListener和Runnable,生成两个方法,addListener()和run(),并且给按钮绑定监听事件。同时设置一个标记isScroll来判断启动情况,isScroll为false时暂停。
给按钮绑定监听,以及addListener()和run()的代码如下。
private void addListener() {
btnStart.addActionListener(this);
btnCancel.addActionListener(this);
}
//按钮事件
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == btnStart) {
synchronized (this) {
notify();
isScroll = true;
tips.setText(“开始截取吧!”);
}
}
}
}
if (obj == btnCancel) {
synchronized (this) {
isScroll = false;
tips.setText(“请你在启动后再开始截取呦!”);
}
}
}
@Override
public void run() {
while (true) {
try {//isScroll为false时暂停
if (!isScroll) {
synchronized (this) {
this.wait();
}
}
ChoseOne();
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这里定义了一个方法ChoseOne()用来随机选出食物,并且把结果放入文件。代码如下。
public void ChoseOne() {
//随机抽取食物
int length = name.length;
Random myRandomName = new Random();
int RN = myRandomName.nextInt(length);
tf.setText(name[RN]);
tips2.setText(“您抽取的是:”+name[RN]);
//获取抽取食物胡时间
Date date = new Date();
SimpleDateFormat dateFormat= new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
File file = new File(“D:\food.txt”);
//将时间和抽取结果放入文件中
try (FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw)){
bw.write(dateFormat.format(date)+name[RN]);
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
在main方法中启动程序,开启线程,现象如下图。