public class AnonyDemo {
public static void main(String}`@TOC
实验四
Java Swing 小学生算术练习
- 难度选择(简单整数/中等小数/进阶分数)
- 随机四则运算题目(+ - * /)
- 输入答案点击确认/回车按键校验对错
- 实时统计正确/错误数量
- 界面布局美观,Swing事件处理完整
importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.Random;publicclassMathPracticeextendsJFrame{// 界面组件privateJRadioButtoneasyRBtn,midRBtn,hardRBtn;privateJLabelquestionLabel;privateJTextFieldanswerInput;privateJButtonconfirmBtn,nextBtn;privateJLabelresultTipLabel;privateJLabelcountLabel;// 题目数据privatedoublenum1,num2;privatecharop;privateintrightCount=0;privateintwrongCount=0;privateRandomrandom=newRandom();publicMathPractice(){// 窗口基础设置setTitle("小学生算术练习软件");setSize(450,320);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null);setLayout(newBorderLayout(10,10));setResizable(false);// 1. 难度选择面板JPaneldiffPanel=newJPanel();diffPanel.setLayout(newFlowLayout(FlowLayout.CENTER,15,5));diffPanel.setBorder(BorderFactory.createTitledBorder("选择难度"));easyRBtn=newJRadioButton("简单(整数)",true);midRBtn=newJRadioButton("中等(小数)");hardRBtn=newJRadioButton("进阶(分数)");ButtonGroupgroup=newButtonGroup();group.add(easyRBtn);group.add(midRBtn);group.add(hardRBtn);diffPanel.add(easyRBtn);diffPanel.add(midRBtn);diffPanel.add(hardRBtn);// 2. 题目展示面板JPanelqPanel=newJPanel();qPanel.setLayout(newFlowLayout(FlowLayout.CENTER,10,10));questionLabel=newJLabel("点击下一题生成题目",JLabel.CENTER);questionLabel.setFont(newFont("黑体",Font.BOLD,24));questionLabel.setPreferredSize(newDimension(400,40));qPanel.add(questionLabel);// 3. 答案输入面板JPanelinputPanel=newJPanel();inputPanel.setLayout(newFlowLayout(FlowLayout.CENTER,10,5));JLabeltip=newJLabel("你的答案:");tip.setFont(newFont("宋体",Font.PLAIN,16));answerInput=newJTextField(12);answerInput.setFont(newFont("宋体",Font.PLAIN,16));// 回车触发确认答案answerInput.addActionListener(newConfirmListener());confirmBtn=newJButton("确认答案");confirmBtn.addActionListener(newConfirmListener());nextBtn=newJButton("下一题");nextBtn.addActionListener(newNextQuestionListener());inputPanel.add(tip);inputPanel.add(answerInput);inputPanel.add(confirmBtn);inputPanel.add(nextBtn);// 4. 提示与统计面板JPanelbottomPanel=newJPanel();bottomPanel.setLayout(newGridLayout(2,1,5,5));resultTipLabel=newJLabel("请生成题目开始练习",JLabel.CENTER);resultTipLabel.setFont(newFont("宋体",Font.BOLD,16));countLabel=newJLabel("正确:0 道 | 错误:0 道",JLabel.CENTER);bottomPanel.add(resultTipLabel);bottomPanel.add(countLabel);// 组装所有面板add(diffPanel,BorderLayout.NORTH);add(qPanel,BorderLayout.CENTER);add(inputPanel,BorderLayout.SOUTH);add(bottomPanel,BorderLayout.PAGE_END);// 边距留白getContentPane().setBorder(BorderFactory.createEmptyBorder(10,10,10,10));}// 生成随机四则运算题目privatevoidcreateQuestion(){char[]ops={'+','-','*','/'};op=ops[random.nextInt(4)];// 根据难度生成数字if(easyRBtn.isSelected()){// 简单:1~20整数num1=random.nextInt(20)+1;num2=random.nextInt(20)+1;// 除法避免小数,保证整除if(op=='/'){num2=random.nextInt(10)+1;num1=num2*(random.nextInt(10)+1);}}elseif(midRBtn.isSelected()){// 中等:1位小数num1=Math.round((random.nextDouble()*20+1)*10)/10.0;num2=Math.round((random.nextDouble()*20+1)*10)/10.0;if(op=='/'){num2=Math.round((random.nextDouble()*10+1)*10)/10.0;num1=num2*(random.nextInt(10)+1);}}else{// 进阶:模拟分数展示,用小数计算num1=random.nextInt(10)+1;num2=random.nextInt(9)+1;if(op=='/'){num1=num2*(random.nextInt(8)+1);}}// 更新题目显示questionLabel.setText(num1+" "+op+" "+num2+" = ?");answerInput.setText("");resultTipLabel.setText("请输入答案后确认");}// 计算标准答案privatedoublegetStandardAnswer(){returnswitch(op){case'+'->num1+num2;case'-'->num1-num2;case'*'->num1*num2;case'/'->num1/num2;default->0;};}// 确认答案按钮/回车事件监听器classConfirmListenerimplementsActionListener{@OverridepublicvoidactionPerformed(ActionEvente){StringinputStr=answerInput.getText().trim();if(inputStr.isEmpty()){resultTipLabel.setText("⚠️ 请输入答案!");resultTipLabel.setForeground(Color.RED);return;}doubleuserAns;try{userAns=Double.parseDouble(inputStr);}catch(NumberFormatExceptionex){resultTipLabel.setText("⚠️ 输入格式错误,请输入数字!");resultTipLabel.setForeground(Color.RED);return;}doublestdAns=getStandardAnswer();// 浮点误差兼容,差值小于0.01判定正确if(Math.abs(userAns-stdAns)<0.01){rightCount++;resultTipLabel.setText("✅ 回答正确!太棒了");resultTipLabel.setForeground(newColor(0,150,0));}else{wrongCount++;resultTipLabel.setText("❌ 回答错误,正确答案:"+stdAns);resultTipLabel.setForeground(Color.RED);}// 更新统计countLabel.setText("正确:"+rightCount+" 道 | 错误:"+wrongCount+" 道");}}// 下一题按钮监听器classNextQuestionListenerimplementsActionListener{@OverridepublicvoidactionPerformed(ActionEvente){createQuestion();resultTipLabel.setForeground(Color.BLACK);}}publicstaticvoidmain(String[]args){// Swing程序建议在UI线程启动SwingUtilities.invokeLater(()->{MathPracticeapp=newMathPractice();app.setVisible(true);});}}一、实验对应知识点说明
- Swing核心GUI类
JFrame:主窗口容器JPanel:面板容器,布局管理JLabel:文本标签(题目、提示、统计)JTextField:单行输入框(填写答案)JButton:按钮组件JRadioButton/ButtonGroup:单选难度选择- 布局管理器:
BorderLayout、FlowLayout、GridLayout
- 事件处理三要素
- 事件源:按钮
JButton、输入框JTextField - 监听器接口:
ActionListener - 事件处理:实现
actionPerformed()方法,匿名内部类/内部类完成回调
- 扩展功能:输入框回车直接校验答案,复用同一监听器
- 题目功能实现
- 四则运算:
+ - * /随机抽取 - 难度分层:整数/小数/分数三类随机数生成
- 容错处理:除法保证整除、浮点计算误差兼容、非法输入捕获
- 数据统计:记录正确/错误题目数量
二、运行操作步骤
- 新建文本文档,复制全部代码粘贴
- 修改文件后缀为
MathPractice.java - 使用javac编译、java运行,或直接在IDEA/Eclipse打开运行
- 操作流程:
- 选择难度等级
- 点击【下一题】生成随机算术题
- 在输入框填写答案,点击【确认答案】或直接按回车键校验
- 界面实时提示对错,并更新答题统计
- 重复点击下一题持续练习
三、实验拓展说明
- 操作数扩展:代码已支持整数、小数,进阶模式可自行修改生成分数字符串展示
- 运算符扩展:修改
ops数组,新增%取模运算 - 难度扩展:新增高难度单选框,扩大随机数范围、增加多步运算
- 界面扩展:增加清空统计、计时、错题本功能按钮
- 交互扩展:添加弹窗提示、答题音效、分数评级
##核心要点
- Swing使用容器+组件分层搭建GUI界面,通过布局管理器规范控件排版
- Java事件模型:组件绑定监听器,触发动作时执行重写的事件处理方法
- 匿名内部类/内部类实现监听器,简化回调代码,适配GUI交互场景
- 随机数、浮点运算、异常捕获完成算术题库逻辑,实现小学生练习需求
setAccessible、setFont、setForeground等方法修改组件外观属性,优化界面美观度