【详细实现】v1.1 随机点名应用

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编程,并激发你的学习兴趣和创造力。

       

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值