实验四 Java Swing图形用户界面

📅 2026/7/2 2:39:32
实验四 Java Swing图形用户界面
一、 实验目的掌握 Java Swing 常用 GUI 组件窗口、标签、按钮、输入框、下拉框、面板等的创建、布局与属性设置搭建可视化图形界面。理解 Java 事件处理机制事件源、事件监听器、事件处理接口学会给按钮、下拉框绑定点击事件。实现随机算术题生成支持加减乘除四则运算兼容整数运算可拓展小数、分数计算。完成难度自定义、答案校验、正误提示等交互逻辑开发完整可运行的小学生算术练习小程序。规范界面布局美化提升程序易用性熟练使用 Eclipse 完成 Swing 项目编码、调试与运行。二、实验环境Eclipse三、实验内容(写出主要的内容)实验一MathPractice.Javaimport javax.swing.;import java.awt.;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;public class MathPractice extends JFrame implements ActionListener {// 界面组件JComboBox diffCombo;JLabel lblQuestion;JTextField txtAnswer;JButton btnCheck, btnNext, btnReset;JLabel lblTip;// 运算数据 Random random new Random(); double num1, num2, result; String op; int maxNum 10; // 整数范围基准 public MathPractice() { // 窗口基础设置 setTitle(小学生算术练习系统支持整数/小数); setSize(450, 320); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setLayout(new BorderLayout(10, 10)); setResizable(false); // 1. 顶部难度面板 JPanel pnlTop new JPanel(new FlowLayout(FlowLayout.LEFT)); pnlTop.add(new JLabel(选择难度)); String[] diffArr {简单(0~10), 中等(0~50), 困难(0~100)}; diffCombo new JComboBox(diffArr); diffCombo.addActionListener(this); pnlTop.add(diffCombo); add(pnlTop, BorderLayout.NORTH); // 2. 中间题目显示面板 JPanel pnlQuestion new JPanel(); lblQuestion new JLabel(题目); lblQuestion.setFont(new Font(微软雅黑, Font.BOLD, 22)); pnlQuestion.add(lblQuestion); add(pnlQuestion, BorderLayout.CENTER); // 3. 底部总面板输入区按钮区分两行 JPanel pnlBottom new JPanel(new GridLayout(2, 1, 5, 10)); // 输入行 JPanel pnlInput new JPanel(); pnlInput.add(new JLabel(你的答案)); txtAnswer new JTextField(12); txtAnswer.setFont(new Font(微软雅黑, Font.PLAIN, 18)); pnlInput.add(txtAnswer); lblTip new JLabel(); lblTip.setForeground(Color.RED); pnlInput.add(lblTip); pnlBottom.add(pnlInput); // 按钮行 JPanel pnlBtn new JPanel(); btnCheck new JButton(判断答案); btnNext new JButton(下一题); btnReset new JButton(重置); btnCheck.addActionListener(this); btnNext.addActionListener(this); btnReset.addActionListener(this); pnlBtn.add(btnCheck); pnlBtn.add(btnNext); pnlBtn.add(btnReset); pnlBottom.add(pnlBtn); add(pnlBottom, BorderLayout.SOUTH); createQuestion(); } // 生成随机题目随机整数 / 小数支持-*/ private void createQuestion() { lblTip.setText(); txtAnswer.setText(); // 50%概率整数50%概率一位小数 if (random.nextBoolean()) { num1 random.nextInt(maxNum 1); num2 random.nextInt(maxNum 1); } else { num1 random.nextInt(maxNum * 10 1) / 10.0; num2 random.nextInt(maxNum * 10 1) / 10.0; } int opCode random.nextInt(4); switch (opCode) { case 0: op ; result num1 num2; break; case 1: op -; // 保证结果不为负数 if (num1 num2) { double t num1; num1 num2; num2 t; } result num1 - num2; break; case 2: op *; result num1 * num2; break; case 3: op /; // 除数不能为0 while (num2 0) { if (random.nextBoolean()) { num2 random.nextInt(maxNum 1); } else { num2 random.nextInt(maxNum * 10 1) / 10.0; } } result num1 / num2; break; } // 显示题目 lblQuestion.setText(num1 op num2 ?); } Override public void actionPerformed(ActionEvent e) { // 切换难度 if (e.getSource() diffCombo) { String select (String) diffCombo.getSelectedItem(); if (select.contains(简单)) maxNum 10; else if (select.contains(中等)) maxNum 50; else maxNum 100; createQuestion(); } // 下一题 else if (e.getSource() btnNext) { createQuestion(); } // 重置 else if (e.getSource() btnReset) { maxNum 10; diffCombo.setSelectedIndex(0); createQuestion(); } // 判断答案支持小数输入 else if (e.getSource() btnCheck) { String input txtAnswer.getText().trim(); try { double userAns Double.parseDouble(input); // 浮点数误差差值小于0.01视为正确 if (Math.abs(userAns - result) 0.01) { lblTip.setText(回答正确太棒啦); lblTip.setForeground(new Color(0, 128, 0)); } else { lblTip.setText(回答错误正确答案 String.format(%.2f, result)); lblTip.setForeground(Color.RED); } } catch (NumberFormatException ex) { lblTip.setText(请输入合法数字整数/小数均可); lblTip.setForeground(Color.RED); } } } public static void main(String[] args) { SwingUtilities.invokeLater(() - { new MathPractice().setVisible(true); }); }}四、心得体会本次 Java Swing 图形界面实验我完成了面向小学生的算术练习程序实现自定义难度、随机四则运算、整数与小数混合出题、答案校验等全部要求完整走完 GUI 界面搭建、事件处理、功能拓展的全过程收获很多。在技术学习上我彻底理解了 Swing 图形界面开发的基础逻辑熟练掌握 JFrame、JPanel、JButton、下拉框、文本输入框等常用组件学会使用 BorderLayout、GridLayout、FlowLayout 布局管理器划分界面区域解决了之前底部面板互相覆盖、输入框消失的布局 bug明白了不同布局的适用场景。同时吃透了 Java 事件处理机制通过实现 ActionListener 统一监听下拉框、按钮的点击事件理清了事件源、监听器、事件处理方法三者的对应关系。针对实验要求 “操作数支持整数、小数”我修改原有整数运算逻辑用 double 类型存储数值增加随机小数生成逻辑还处理了浮点数精度误差、除数为 0、减法负数等边界问题并且通过 try-catch 捕获数字转换异常防止程序因非法输入崩溃代码健壮性得到提升。