1.了解项目目标
首先,让我们明确项目的目标:我们将创建一个Java应用程序,可以从一个名单中随机选择一个名字,并将选中的名字显示在界面上。此外,我们还将记录已选中的名字,以便用户可以查看历史记录。
说明:随堂测试版本,需要迭代加入的功能
功能:点过的名字要显示在界面上、并保存到一个文件夹中
界面:增加文字颜色特效
2. 确定技术路线
在开始编码之前,我们需要确认我们将使用的技术栈。对于这个简单的项目,我们将使用Java Swing库来构建用户界面。Java Swing是一个用于构建图形用户界面(GUI)的Java库,它提供了丰富的组件和工具,方便我们创建交互式的界面。
3. 设置项目环境
确保你的开发环境已经设置好。
你需要安装JD:JDK1.7以上
集成开发环境:IntelliJ IDEA
4. 编写代码
接下来,我们开始编写代码。我们将逐步实现以下功能:
- 读取名字列表文件
// 从文件中读取名字的方法
private void readNamesFromFile(String filename) {
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split("\\."); // 按照"."分割每行数据
if (parts.length == 2) {
names.add(parts[1].trim()); // 将名字添加到列表中
}
}
} catch (IOException e) {
System.err.println("无法读取文件: " + e.getMessage());
}
}
- 在界面上显示选中的名字
// 初始化面板和组件
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3, 1));
selectedNameLabel = new JLabel("选中的名字将在这里显示。");
selectedNameLabel.setFont(new Font(Font.DIALOG, Font.BOLD, 30)); // 设置选中名字的字体
historyLabel = new JLabel("历史选中过的名字:");
historyLabel.setFont(new Font(Font.DIALOG, Font.PLAIN, 18)); // 设置历史记录的字体
JButton selectButton = new JButton("选择名字");
selectButton.setFont(new Font(Font.DIALOG, Font.PLAIN, 20)); // 设置按钮的字体
selectButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectRandomName();
}
});
- 记录历史选中的名字
// 更新历史记录标签的方法
private void updateHistoryLabel() {
StringBuilder sb = new StringBuilder("<html><font color='green'>历史选中过的名字:<br>");
int count = 0;
for (String name : selectedNames) {
if (count > 8) {
sb.append("<br>");
count = 0;
}
sb.append(name).append(", ");
count++;
}
if (sb.length() > 0) {
sb.setLength(sb.length() - 2); // 移除末尾的逗号和空格
}
sb.append("</font></html>");
historyLabel.setText(sb.toString());
}
- 从名字列表中随机选择一个名字
// 选择随机名字的方法
public void selectRandomName() {
if (!names.isEmpty()) {
String selectedName = pickRandomName();
writeNameToFile(selectedName);
selectedNameLabel.setText("<html><font color='blue'>选中的名字是:" + selectedName + "</font></html>"); // 添加选中特效
selectedNames.add(selectedName);
updateHistoryLabel();
} else {
selectedNameLabel.setText("没有更多的名字可供选择。");
}
}
- 将选中的名字写入文件
// 将选中的名字写入文件的方法
private void writeNameToFile(String name) {
try (FileWriter writer = new FileWriter(OUTPUT_FILE, true)) {
writer.write(name + "\n"); // 写入选中的名字到文件中
} catch (IOException e) {
System.err.println("无法写入文件: " + e.getMessage());
}
}
我们将采取逐步迭代的方式,一步一步地构建程序,确保每个步骤都能正确实现功能。
5. 理解代码
仔细分析每一行代码,确保理解其作用和功能。这有助于我们巩固Java的基础知识,并学习如何使用Java Swing库构建用户界面。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/*
* v2.0
* 该程序是一个简单的随机点名程序,从指定的文件中随机选择名字,并显示在界面上。
* 程序界面经过美化,选中的名字有特效显示,并显示历史选中的名字。
*/
public class NameSelectorSwing extends JFrame {
private static final String INPUT_FILE = "names.txt"; // 输入文件名
private static final String OUTPUT_FILE = "selected_names.txt"; // 输出文件名
private List<String> names; // 存储所有名字
private Random random; // 用于生成随机数
private JLabel selectedNameLabel; // 显示选中的名字的标签
private JLabel historyLabel; // 显示历史选中的名字的标签
private List<String> selectedNames; // 存储历史选中的名字
// 构造函数,初始化界面和变量
public NameSelectorSwing() {
names = new ArrayList<>();
random = new Random();
selectedNames = new ArrayList<>();
// 设置窗口居中显示
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((screenSize.getWidth() - getWidth()) / 2);
int y = (int) ((screenSize.getHeight() - getHeight()) / 2);
setLocation(x, y);
// 从文件读取名字
readNamesFromFile(INPUT_FILE);
// 初始化面板和组件
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3, 1));
selectedNameLabel = new JLabel("选中的名字将在这里显示。");
selectedNameLabel.setFont(new Font(Font.DIALOG, Font.BOLD, 30)); // 设置选中名字的字体
historyLabel = new JLabel("历史选中过的名字:");
historyLabel.setFont(new Font(Font.DIALOG, Font.PLAIN, 18)); // 设置历史记录的字体
JButton selectButton = new JButton("选择名字");
selectButton.setFont(new Font(Font.DIALOG, Font.PLAIN, 20)); // 设置按钮的字体
selectButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectRandomName();
}
});
panel.add(selectedNameLabel);
panel.add(historyLabel);
add(panel, BorderLayout.CENTER);
add(selectButton, BorderLayout.SOUTH);
setTitle("随机点名"); // 设置窗口标题
setSize(600, 300); // 设置窗口大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭操作
setVisible(true); // 显示窗口
}
// 主方法,程序入口
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new NameSelectorSwing();
}
});
}
// 选择随机名字的方法
public void selectRandomName() {
if (!names.isEmpty()) {
String selectedName = pickRandomName();
writeNameToFile(selectedName);
selectedNameLabel.setText("<html><font color='blue'>选中的名字是:" + selectedName + "</font></html>"); // 添加选中特效
selectedNames.add(selectedName);
updateHistoryLabel();
} else {
selectedNameLabel.setText("没有更多的名字可供选择。");
}
}
// 更新历史记录标签的方法
private void updateHistoryLabel() {
StringBuilder sb = new StringBuilder("<html><font color='green'>历史选中过的名字:<br>");
int count = 0;
for (String name : selectedNames) {
if (count > 8) {
sb.append("<br>");
count = 0;
}
sb.append(name).append(", ");
count++;
}
if (sb.length() > 0) {
sb.setLength(sb.length() - 2); // 移除末尾的逗号和空格
}
sb.append("</font></html>");
historyLabel.setText(sb.toString());
}
// 从文件中读取名字的方法
private void readNamesFromFile(String filename) {
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split("\\."); // 按照"."分割每行数据
if (parts.length == 2) {
names.add(parts[1].trim()); // 将名字添加到列表中
}
}
} catch (IOException e) {
System.err.println("无法读取文件: " + e.getMessage());
}
}
// 从列表中随机选取一个名字并返回的方法
private String pickRandomName() {
int randomIndex = random.nextInt(names.size());
return names.remove(randomIndex); // 移除并返回随机选取的名字
}
// 将选中的名字写入文件的方法
private void writeNameToFile(String name) {
try (FileWriter writer = new FileWriter(OUTPUT_FILE, true)) {
writer.write(name + "\n"); // 写入选中的名字到文件中
} catch (IOException e) {
System.err.println("无法写入文件: " + e.getMessage());
}
}
}
6. 添加美化效果
一旦基本功能实现了,我们可以考虑为界面添加一些美化效果,比如改变字体大小、颜色和按钮样式等。这些简单的改进可以使程序看起来更加专业和吸引人。
7. 运行效果
完成代码编写后,需要进行测试和调试,确保程序能够按照预期工作。我们将测试各种情况下的程序行为,并修复可能存在的bug和问题。
8. 总结
在项目完成后,我们将总结整个开发过程,回顾所学到的知识和经验。我们将讨论项目中遇到的挑战和解决方案,以及如何进一步扩展和改进程序。
结语
通过这个简单的项目,我们将从零开始学习如何使用Java编写一个实用的应用程序。这个项目涵盖了Java基础知识、面向对象编程、文件操作和图形用户界面等多个方面,对于想要学习Java编程的同学来说,是一个很好的实践项目。希望这篇博客能够帮助你更好地理解Java编程,并激发你的学习兴趣和创造力。