一、文档需求梳理

1.相关知识点

GUI相关的类,组件的属性及功能,事件源、监视器、处理事件的接口

2.实验目的

 学习掌握事件处理

3.实验要求

按以下需求(可扩充),设计并完成一个能运行的且界面美观的小软件。提交可运行软件

程序主要针对小学生的算术计算。

1、可以自定义计算的难度(此项可根据功能进行扩展)

2、随机获取不一样的题目,能通过按键触发确定填写输入的答案是否正确。

3、计算满足+ - *  /(可扩展)

4、操作数可以是整数、小数、分数等等(可扩展)

开发环境:VSCode + Java 扩展包
VSCode 安装插件:Extension Pack for Java(自带 JDK、编译运行、图形界面支持)
配置本地 JDK8 及以上版本,Swing 图形库内置无需额外下载

二、完整可运行代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class MathGame extends JFrame {
    // 界面组件
    private JComboBox<String> diffBox;       // 难度选择
    private JLabel lblQuestion;              // 题目显示
    private JTextField txtAnswer;            // 答案输入框
    private JButton btnCheck;                // 校验按钮
    private JLabel lblTip;                   // 对错提示
    private JLabel lblScore;                 // 得分统计

    // 运算数据
    private Random random = new Random();
    private int num1, num2, op;
    private double rightAns;
    private int rightCount = 0, wrongCount = 0;

    public MathGame() {
        initUI();
        createQuestion(); // 初始生成第一题
    }

    // 初始化界面
    private void initUI() {
        setTitle("小学生算术练习器");
        setSize(420, 260);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 窗口居中
        setLayout(new GridLayout(6, 1, 8, 8));
        setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

        // 1.难度选择
        JPanel p1 = new JPanel();
        p1.add(new JLabel("选择难度:"));
        String[] diffs = {"简单(0-10整数)", "中等(0-50整数)", "困难(小数四则)"};
        diffBox = new JComboBox<>(diffs);
        p1.add(diffBox);
        add(p1);

        // 2.题目展示
        lblQuestion = new JLabel("题目:", SwingConstants.CENTER);
        lblQuestion.setFont(new Font("微软雅黑", Font.BOLD, 20));
        add(lblQuestion);

        // 3.答案输入
        JPanel p3 = new JPanel();
        p3.add(new JLabel("你的答案:"));
        txtAnswer = new JTextField(12);
        p3.add(txtAnswer);
        add(p3);

        // 4.校验按钮
        btnCheck = new JButton("确认答案");
        add(btnCheck);

        // 5.对错提示
        lblTip = new JLabel("等待答题", SwingConstants.CENTER);
        lblTip.setFont(new Font("微软雅黑", Font.BOLD, 16));
        add(lblTip);

        // 6.得分统计
        lblScore = new JLabel("答对:0 道 | 答错:0 道", SwingConstants.CENTER);
        add(lblScore);

        // 绑定按钮点击事件
        btnCheck.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                checkAnswer();
            }
        });
    }

    // 随机生成题目
    private void createQuestion() {
        String diff = (String) diffBox.getSelectedItem();
        op = random.nextInt(4); // 0+ 1- 2* 3/
        double n1, n2;

        switch (diff) {
            case "简单(0-10整数)":
                n1 = random.nextInt(11);
                n2 = random.nextInt(11);
                break;
            case "中等(0-50整数)":
                n1 = random.nextInt(51);
                n2 = random.nextInt(51);
                break;
            default: // 困难小数
                n1 = Math.round(random.nextDouble() * 50 * 10) / 10.0;
                n2 = Math.round(random.nextDouble() * 20 * 10) / 10.0;
                break;
        }
        num1 = (int) n1;
        num2 = (int) n2;

        // 计算标准答案
        switch (op) {
            case 0: rightAns = n1 + n2; break;
            case 1: rightAns = n1 - n2; break;
            case 2: rightAns = n1 * n2; break;
            case 3:
                if (n2 == 0) n2 = 1; // 除数不能为0
                rightAns = n1 / n2;
                break;
        }

        // 拼接题目字符串
        char operator;
        switch (op) {
            case 0: operator = '+'; break;
            case 1: operator = '-'; break;
            case 2: operator = '*'; break;
            default: operator = '/';
        }
        lblQuestion.setText("" + n1 + " " + operator + " " + n2 + " = ?");
        txtAnswer.setText("");
        lblTip.setText("等待答题");
    }

    // 校验答案
    private void checkAnswer() {
        String input = txtAnswer.getText().trim();
        double userAns;
        try {
            userAns = Double.parseDouble(input);
        } catch (Exception e) {
            lblTip.setText("输入格式错误,请输入数字!");
            lblTip.setForeground(Color.RED);
            return;
        }

        // 误差0.01内判定正确,适配小数
        if (Math.abs(userAns - rightAns) < 0.01) {
            lblTip.setText("回答正确!");
            lblTip.setForeground(new Color(0, 160, 0));
            rightCount++;
        } else {
            lblTip.setText("回答错误,正确答案:" + String.format("%.2f", rightAns));
            lblTip.setForeground(Color.RED);
            wrongCount++;
        }
        // 更新得分
        lblScore.setText("答对:" + rightCount + " 道 | 答错:" + wrongCount + " 道");
        // 2秒后自动刷新下一题
        new Thread(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
            }
            SwingUtilities.invokeLater(this::createQuestion);
        }).start();
    }

    public static void main(String[] args) {
        // Swing程序需在图形线程启动
        SwingUtilities.invokeLater(() -> {
            MathGame game = new MathGame();
            game.setVisible(true);
        });
    }
}

三、VSCode 运行步骤
环境准备
打开 VSCode,左侧扩展商店搜索安装 Extension Pack for Java,安装完成后配置 JDK1.8 及以上版本。
新建文件
新建文件夹,在文件夹内创建 MathGame.java,将上面完整代码复制粘贴进去。
运行程序
右键代码空白处 → 选择 Run Java;
或点击代码上方绿色运行按钮,自动编译并弹出 Swing 图形窗口

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐