Java 11.8 上机实验 算数测试 (Java程序设计精编教程 第三版)

实验要求

编写一个算术测试的小软件,用来训练小学生的算术能力。程序由3个类组成,其中Teacher对象充当监视器,负责给出算术题目,并判断回答者的答案是否正确,ComputerFrame对象负责为算术题目提供视图,比如用户可以通过对象ComputerFrame对象提供的GUI界面看到题目,并通过该GUI界面给出题目的答案,MainClass是软件主类。

代码加注释

MainClass.java

public class MainClass {
    public static void main(String[] args) {
        ComputerFrame frame;
        frame=new ComputerFrame();
        frame.setTitle("算数测试");//设置窗口的名称(菜单条名称)
        frame.setBounds(100,100,650,180);//设置窗口的位置大小
    }
}

ComputerFrame.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ComputerFrame extends JFrame {
    JMenuBar menubar;//创建菜单条
    JMenu choiceGrade;//创建菜单 一级菜单 选择等级 (等级1,等级2)
    JMenuItem grade1,grade2;//创建菜单项 二级菜单
    JTextField textOne,textTwo,textResult;//创建3个文本框 数1 + 数二 = 结果 三个文本框
    JButton getProblem,giveAnswer;//创建2个按钮(获取题目(随机获取) 确认答案)
    JLabel operatorLabel,message;//创建标签设置操作符+/-
    Teacher teacherzhang;//声明teacher对象 声明自制的监视器
    ComputerFrame(){
        teacherzhang =new Teacher();//为监视器分配变量
        teacherzhang.setMaxInteger(20);//设置随机出现的最大数
        setLayout(new FlowLayout());//设置布局类为FlowLayout型(创建一个居中对齐的布局对象)
        menubar = new JMenuBar();//为菜单条分配变量
        choiceGrade = new JMenu("选择级别");//为一级菜单分配变量并命名
        grade1 = new JMenuItem("幼儿级别");//二级菜单 等级1
        grade2 = new JMenuItem("儿童级别");//二级菜单 等级二
        grade1.addActionListener(new ActionListener() {//给等级1增加监视器,设置随机产生的最大数为10,点击触发
            public void actionPerformed(ActionEvent e) {
                teacherzhang.setMaxInteger(10);
            }
        });
        grade2.addActionListener(new ActionListener() {//给等级二增加监视器,设置随机产生的最大数为50,点击触发
            public void actionPerformed(ActionEvent e) {
                teacherzhang.setMaxInteger(50);
            }
        });
        choiceGrade.add(grade1);//将二级菜单等级1装入一级菜单 choiceGrade里(这里具体指将“幼儿级别”菜单项添加到“选择级别”菜单里)
        choiceGrade.add(grade2);//将二级菜单等级2装入一级菜单 choiceGrade里(这里具体指将“儿童级别”菜单项添加到“选择级别”菜单里)
        menubar.add(choiceGrade);//将一级菜单装入菜单条menubar里(这里具体指将“选择级别”菜单添加到“算数测试”菜单条里)
        setJMenuBar(menubar);//将菜单条添加到JFrame中
        textOne = new JTextField(5);//创建文本框textOne(数字1),长度为5
        textTwo = new JTextField(5);//创建文本框textTwo(数字二),长度为5
        textResult = new JTextField(5);//创建文本框textResult(结果),长度为5
        operatorLabel = new JLabel("+");//创建标签operatorLabel(运算符),设置为加号
        operatorLabel.setFont(new Font("Arial", Font.BOLD, 20));//设置标签颜色大小
        message = new JLabel("你还没有回答");//创建提示文本框
        getProblem = new JButton("获取题目");//创建获取题目按钮
        giveAnswer = new JButton("确认答案");//创建确认答案按钮
        add(textOne);//将textOne文本框装入窗口                        数1
        add(operatorLabel);//将operatorLabel标签装入窗口              +
        add(textTwo);//将textTwo文本框装入窗口                        数二
        add(new JLabel("="));//新建标签设置为“=”号,装入窗口       =
        add(textResult);//将textResult文本框装入窗口                  结果
        add(giveAnswer);//将确认答案按钮加入窗口                       确认答案
        add(message);//将提示标签加入窗口                             提示
        add(getProblem);//将获取题目按钮加入窗口                       获取题目
        textResult.requestFocus();//设置为有输入的焦点
        textOne.setEditable(false);//将textOne文本框设置为不可编辑
        textTwo.setEditable(false);//将textTwo文本框设置为不可编辑
        getProblem.setActionCommand("getProblem");//设置按钮getProblem的触发属性字符为"getProblem"
        textResult.setActionCommand("answer");//设置文本框giveAnswer的触发属性字符为"answer"
        giveAnswer.setActionCommand("answer");//设置按钮(JButton)giveAnswer的触发属性字符为"answer"
        teacherzhang.setJTextField(textOne, textTwo, textResult);//将textOne,textTwo,textResult三个文本框传入teacherZhang中
        teacherzhang.setJLabel(operatorLabel, message);//将operatorLabel, message两个标签传入teacherZhang中
        getProblem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                teacherzhang.actionPerformed(e);
            }
        });//将teacherZhang注册为getProblem按钮的事件监视器
        giveAnswer.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                teacherzhang.actionPerformed(e);
            }
        });//将teacherZhang注册为giveAnswer按钮的事件监视器
        textResult.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                teacherzhang.actionPerformed(e);
            }
        });//将teacherZhang注册为textResult文本框的事件监视器
        setVisible(true);//设置可见性
        validate();
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);//设置默认关闭操作 隐藏窗口后 释放资源
    }

}

Teacher.java

import java.awt.*;
import java.awt.event.*;
import java.util.Random;

import javax.swing.*;

public class Teacher implements ActionListener{//创建一个监视器 继承接口监视器监控
    int numberOne, numberTwo;//储存获取的textOne和textTwo的值
    String operator = "";//储存运算符
    boolean isRight;//
    Random random;//产生随机数
    int maxInteger;//储存最大数
    JTextField textOne, textTwo, textResult;//创建文本框用来接收ComputerFrame传来的三个文本框 数1 数2 结果
    JLabel operatorLabel, message;//创建标签用来接收ComputerFrame传来的两个标签,运算符和提示

    Teacher() {
        random = new Random();//产生随机类,生成随机数
    }

    public void setMaxInteger(int n) {//设置最大整数
        maxInteger = n;
    }

    public void actionPerformed(ActionEvent e) {//重写 ActionListener接口继承的方法
        String str = e.getActionCommand();//获得e的触发字符串
        if (str.equals("getProblem")) {//如果获得的为获取题目的字符串
            numberOne = random.nextInt(maxInteger) + 1;//随机获得一个数储存到numberOne
            numberTwo = random.nextInt(maxInteger) + 1;//随机获得一个数储存到numberTwo
            double d = Math.random();
            if (d >= 0.5)
                operator = "+";
            else
                operator = "-";//将操作符随机为加 减
            textOne.setText("" + numberOne);//将数1传到textOne文本框中
            textTwo.setText("" + numberTwo);//将数2传到textTwo文本框中
            operatorLabel.setText(operator);//将操作符传到文本框中
            message.setText("请回答");//设置提示为请回答
            textResult.setText(null);//结果为空
        } else if (str.equals("answer")) {//如果获取的为确认答案的字符串
            String answer = textResult.getText();//将结果文本框里的字符存储到answer中
            try {
                int result = Integer.parseInt(answer);//将字符串转换为int型
                if (operator.equals("+")) {//+操作时
                    if (result == numberOne + numberTwo)//运算正确
                        message.setText("你的回答正确");//修改设置提示标签
                    else
                        message.setText("你的回答错误");//答案错误
                } else if (operator.equals("-")) {//-操作
                    if (result == numberOne - numberTwo)
                        message.setText("你的回答正确");
                    else
                        message.setText("你的回答错误");
                }
            } catch (NumberFormatException ex) {//捕捉结果输入有误时 提示请输入数字字符
                message.setText("请输入数字字符");
            }
        }
    }

    public void setJTextField(JTextField... t) {//负责接收三个文本框的方法
        textOne = t[0];
        textTwo = t[1];
        textResult = t[2];
    }

    public void setJLabel(JLabel... label) {//负责接收两个提示的方法
        operatorLabel = label[0];
        message = label[1];
    }
}

运算结果:

无输入
在这里插入图片描述结果正确
在这里插入图片描述结果错误
在这里插入图片描述

  • 16
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值