1.引言
前面对这个应用的功能做了详细的分析(长什么样、能干什么),以先这样对一个项目最开始的分析成为需求分析,需求分析之后就是设计阶段。
那么一般的项目,在设计阶段都需要干什么呢?在需求分析阶段确定需求后,设计阶段负责将需求转换为具体的系统设计方案。在这个阶段,开发团队会设计系统的整体结构、模块间的交互方式、数据存储方案等。设计阶段的目标是为开发团队提供一个清晰的指导方向,确保系统设计满足需求和性能要求。
如上所知,我们的项目在设计阶段主要思考数据、模块功能相关的任务。那么在这个随机点名应用中,我们应该关注哪些内容呢?
注意:上面的需求分析阶段、设计阶段是我们按照软件工程开发软件的过程进行划分的,这样的好处是让我们开发一个项目的时候思路更为清楚,这个阶段的划分也是程序员积累了大量经验之后
来划分的,注意前后关系:现有软件的开发、再有这些阶段方法的划分。那么我想和同学们表达的是,你在开发一个项目的时候,不要硬拗这个步骤,要针对你的项目具体来分析,这些专业名词是将我们的开发步骤高度凝练了,你在第一次学习项目的开发的时候,要多思考!思考自己去实现去完成这个项目该如何做!
ok,再回到我们这个项目的设计中,需要关注数据、功能模块之间的交互。
前面我们简单写到:
数据:程序内直接写入(集合或文件导入)
界面:无特效、只显示
那么,接下来我们详细去思考如何处理。新建一个工程一起动手开始做吧!
2.数据来源与处理
2.1 ArrayList集合保存数据
方法一:直接用一个集合保存,在这里我们用新学到的ArrayList集合来保存我们的学生名字。
import java.util.ArrayList;
public class StudentListExample {
public static void main(String[] args) {
// 创建一个ArrayList来保存学生名字数据
ArrayList<String> studentNames = new ArrayList<>();
// 添加学生名字数据
studentNames.add("张三");
studentNames.add("李四");
studentNames.add("王五");
studentNames.add("赵六");
// 打印输出学生名字数据
System.out.println("学生名字列表:");
for (String name : studentNames) {
System.out.println(name);
}
}
}
在这里,我们可以看到用前面学习的add方法能够添加学生的名字到studentNames对象中,但是同学们发现这样一个个加名字的方式很麻烦!如果有200个学生,你也要写200行add()方法吗?所以,修改上面的这个代码,用前面学到的数组、循环的方式,将学生的数据加入studentNames 对象中。
先自己思考,如何实现,再参考以下代码:
如果你修改好了,点击这个链接看看参考代码如何写!
2.2 升级:使用文件导入数据保存到ArrayList集合
上面,大家可以发现是直接将数据写进程序里面的,在实际开发中,我们的数据往往是来源于文件:txt、csv等等,而且数据也是庞大的。那么有没有比较好的方法能让我们直接将准备好的文件数据导入进去呢?
首先,我们得准备一个名字文件。如截图所示:
在这里要注意到,我们保存名字的txt文件中,每一行保存一个名字,每一行的形式都是“编号。名字”来保存,那么我们在读取的时候应该对数据进行处理。(分割处理)
然后使用File类来读取文件:names.txt
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 创建一个 ArrayList 对象来存储读取的中文名字
ArrayList<String> chineseNames = new ArrayList<>();
try {
// 创建一个 File 对象,指向名为 "names.txt" 的文件
File file = new File("names.txt");
Scanner scanner = new Scanner(file);
// 逐行读取文件内容
while (scanner.hasNextLine()) {
// 读取一行数据
String data = scanner.nextLine();
// 根据 "." 进行分割
String[] parts = data.split("\\.");
// 如果成功分割成两部分(数字和名字)
if (parts.length == 2) {
// 获取名字部分并去除空格后存储到 ArrayList 中
String name = parts[1].trim();
chineseNames.add(name);
}
}
scanner.close();
System.out.println("读取的中文名字列表:");
// 输出处理后的名字列表
for (String name : chineseNames) {
System.out.println(name);
}
} catch (FileNotFoundException e) {
System.out.println("找不到文件");
e.printStackTrace();
}
}
}
除此之外,大家还要注意文件的存取路径,names.txt应该放在你工程下面,如图所示。
将上面的代码测试运行,你的控制台上应该输出这样的内容:
由上可知,我们的名字无论是通过第一种还是第二种方式,都可以保存到对应的ArrayList类对象中。
3.核心点名功能的实现
现在数据有了,接下来是实现点名功能,那么怎么实现呢?
还记得前面学过的随机数类吗?Random类的核心方法再给大家回顾一下:
-
nextInt()
: 生成一个随机的整数,范围是整数的全部取值范围,包括负数和正数。 -
nextInt(int bound)
: 生成一个随机的整数,范围是[0, bound)
,即大于等于 0,小于 bound。 -
nextLong()
: 生成一个随机的长整数。 -
nextDouble()
: 生成一个随机的双精度浮点数,范围是[0.0, 1.0)
,包括 0.0,不包括 1.0。 -
nextFloat()
: 生成一个随机的单精度浮点数,范围是[0.0, 1.0)
,包括 0.0,不包括 1.0。 -
nextBoolean()
: 随机生成一个布尔值,即true
或false
。 -
nextBytes(byte[] bytes)
: 生成随机的字节数组,填充给定的字节数组bytes
。 -
setSeed(long seed)
: 设置随机数生成器的种子,相同的种子将产生相同的随机序列。
那么,核心的点名功能该如何实现呢?大家动手尝试,采用Random类随机给我们的chineseNames这个里面的数据,随机选出一个。
代码很简单,简洁的写法只需要三行!
如果你动手尝试了,看一下这个参考代码吧。
运行程序,可以看到随机选取了一个名字!
4.交互界面的实现
4.1 交互界面类介绍
Swing 是 Java 提供的一套用于创建图形用户界面(GUI)的工具包。它提供了丰富的组件库,可以用于构建各种交互式和可视化的应用程序,如桌面应用程序、工具、游戏等。Swing 是 Java 提供的官方 GUI 工具包,因此具有很好的跨平台性,可以在不同操作系统上运行而无需对代码进行修改。
Swing 的特点包括:
-
组件丰富:Swing 提供了各种常用的 GUI 组件,如按钮、标签、文本框、列表框、下拉框、表格等,开发者可以通过组合这些组件来构建复杂的界面。
-
可定制性强:Swing 组件支持丰富的外观和行为定制,可以通过设置属性、样式、监听器等来实现界面的个性化设计。
-
事件驱动:Swing 使用事件驱动的模型,开发者可以为组件添加各种事件监听器,以便在用户交互时做出相应的处理。
-
跨平台性:Swing 是基于 Java 编写的,可以在不同操作系统上运行而无需修改代码。这使得开发者可以编写一次代码,就能在多个平台上部署应用程序。
-
轻量级:Swing 是一个轻量级的 GUI 工具包,不依赖于操作系统的 GUI 组件,而是使用 Java 绘制组件,因此具有较小的内存占用和启动时间.
Swing用法的简单展示
4.2 加入可视化界面
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ChineseNameGeneratorGUI extends JFrame {
private JLabel nameLabel;
private JButton generateButton;
private ArrayList<String> chineseNames;
public ChineseNameGeneratorGUI() {
setTitle("随机点名");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 200);
setLocationRelativeTo(null); // 让窗口居中显示
nameLabel = new JLabel("点击按钮生成随机名字");
nameLabel.setHorizontalAlignment(SwingConstants.CENTER); // 设置文本居中
generateButton = new JButton("生成");
generateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
File file = new File("names.txt");
Scanner scanner = new Scanner(file, "UTF-8");
chineseNames.clear();
while (scanner.hasNextLine()) {
String data = scanner.nextLine();
String[] parts = data.split("\\.");
if (parts.length == 2) {
String name = parts[1].trim();
chineseNames.add(name);
}
}
scanner.close();
Random random = new Random();
int randomIndex = random.nextInt(chineseNames.size());
String selectedName = chineseNames.get(randomIndex);
nameLabel.setText("随机选择的名字是:" + selectedName);
} catch (FileNotFoundException ex) {
nameLabel.setText("找不到文件");
ex.printStackTrace();
}
}
});
chineseNames = new ArrayList<>();
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(nameLabel, BorderLayout.CENTER);
panel.add(generateButton, BorderLayout.SOUTH);
add(panel);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ChineseNameGeneratorGUI();
}
});
}
}
程序运行结果
5.IntelliJ IDEA来打包和发布Java程序
5.1 打包成可执行jar包
5.2 将jar包拷贝到桌面上,点击运行即可
如果你生成的jar文件到桌面变成压缩包,那么 你可以这样调试
或者采用此方法