实验要求
编写一个算术测试的小软件,用来训练小学生的算术能力。程序由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];
}
}
运算结果:
无输入
结果正确
结果错误