一、实验目的• 学习并使用 Java Swing 各类基础组件与布局管理器独立设计、搭建美观完整的图形交互界面。• 理解事件驱动编程思想掌握事件监听器的使用实现按钮、下拉框等控件的交互响应。• 综合运用随机数、数值转换、四则运算等知识分别完成算术练习器和简易计算器两大程序。• 掌握异常捕获方法对非数字输入、除数为零等异常情况做容错处理提升程序稳定性。• 学习分层、模块化的代码编写方式熟悉 Java 桌面应用完整开发流程提升综合编码能力。二、实验环境IDE三、实验内容(写出主要的上机内容及实验结果或截图)Java Swing 小学生算术出题答题系统import javax.swing.;import java.awt.;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;/**小学生算术练习系统 Swing GUI*/public class Main extends JFrame {// 界面组件private JLabel lblQuestion; // 题目显示private JTextField tfAnswer; // 答案输入框private JLabel lblTip; // 对错提示private JLabel lblCount; // 统计对错private JComboBox cbLevel; // 难度选择private JButton btnSubmit; // 提交答案private JButton btnNext; // 下一题// 运算数据private Random random new Random();private double num1, num2;private char op;private double rightAnswer;private int rightCnt 0;private int wrongCnt 0;public Main() {initUI();createNewQuestion(); // 初始化第一题}// 初始化界面private void initUI() {setTitle(“小学生算术练习器”);setSize(450, 320);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null); // 窗口居中setLayout(new BorderLayout(10, 10));setResizable(false);// 顶部难度选择面板 JPanel panelTop new JPanel(); panelTop.add(new JLabel(选择难度)); String[] levels {简单(10以内加减整数), 中等(100以内四则整数), 困难(小数四则运算)}; cbLevel new JComboBox(levels); panelTop.add(cbLevel); add(panelTop, BorderLayout.NORTH); // 中间核心答题面板 JPanel panelCenter new JPanel(); panelCenter.setLayout(new GridLayout(4, 1, 8, 8)); panelCenter.setBorder(BorderFactory.createEmptyBorder(20, 30, 20, 30)); lblQuestion new JLabel(题目, SwingConstants.CENTER); lblQuestion.setFont(new Font(微软雅黑, Font.BOLD, 22)); JPanel panelInput new JPanel(); panelInput.add(new JLabel(你的答案)); tfAnswer new JTextField(12); tfAnswer.setFont(new Font(微软雅黑, Font.PLAIN, 16)); panelInput.add(tfAnswer); lblTip new JLabel(请输入答案后提交, SwingConstants.CENTER); lblTip.setFont(new Font(微软雅黑, Font.PLAIN, 16)); lblCount new JLabel(答对0 道 | 答错0 道, SwingConstants.CENTER); panelCenter.add(lblQuestion); panelCenter.add(panelInput); panelCenter.add(lblTip); panelCenter.add(lblCount); add(panelCenter, BorderLayout.CENTER); // 底部按钮面板 JPanel panelBottom new JPanel(); btnSubmit new JButton(提交答案); btnNext new JButton(下一题); panelBottom.add(btnSubmit); panelBottom.add(btnNext); add(panelBottom, BorderLayout.SOUTH); // 绑定按钮事件 bindEvent();}// 绑定按钮监听事件private void bindEvent() {// 提交答案btnSubmit.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {checkAnswer();}});// 下一题 btnNext.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { createNewQuestion(); tfAnswer.setText(); lblTip.setText(请输入答案后提交); } });}// 根据难度生成新题目private void createNewQuestion() {int level cbLevel.getSelectedIndex();int opIndex random.nextInt(4);switch (opIndex) {case 0: op ‘’; break;case 1: op ‘-’; break;case 2: op ‘*’; break;case 3: op ‘/’; break;}if (level 0) { // 简单10以内整数 仅加减 num1 random.nextInt(10) 1; num2 random.nextInt(10) 1; if (op * || op /) op random.nextBoolean() ? : -; } else if (level 1) { // 中等100以内整数四则 num1 random.nextInt(100) 1; num2 random.nextInt(100) 1; // 除法避免0 if (op /) { num2 random.nextInt(99) 1; } } else { // 困难0~10小数保留1位小数 num1 Math.round((random.nextDouble() * 10) * 10.0) / 10.0; num2 Math.round((random.nextDouble() * 10) * 10.0) / 10.0; if (op /) { while (num2 0) { num2 Math.round((random.nextDouble() * 10) * 10.0) / 10.0; } } } // 计算标准答案 switch (op) { case : rightAnswer num1 num2; break; case -: rightAnswer num1 - num2; break; case *: rightAnswer num1 * num2; break; case /: rightAnswer num1 / num2; break; } // 显示题目 lblQuestion.setText(num1 op num2 ?);}// 校验答案private void checkAnswer() {String input tfAnswer.getText().trim();if (input.isEmpty()) {lblTip.setText(“⚠️ 请输入答案”);lblTip.setForeground(Color.ORANGE);return;}double userAns; try { userAns Double.parseDouble(input); } catch (NumberFormatException ex) { lblTip.setText(❌ 输入格式错误请输入数字); lblTip.setForeground(Color.RED); return; } // 允许误差0.01兼容小数计算精度 if (Math.abs(userAns - rightAnswer) 0.01) { rightCnt; lblTip.setText(✅ 回答正确太棒了); lblTip.setForeground(new Color(0, 150, 0)); } else { wrongCnt; lblTip.setText(❌ 回答错误正确答案 String.format(%.2f, rightAnswer)); lblTip.setForeground(Color.RED); } // 更新统计 lblCount.setText(答对 rightCnt 道 | 答错 wrongCnt 道);}// 程序入口public static void main(String[] args) {// Swing程序建议在事件调度线程启动SwingUtilities.invokeLater(new Runnable() {Overridepublic void run() {new Main().setVisible(true);}});}}实验 2Java Swing 简易四则计算器import javax.swing.;import javax.swing.border.Border;import java.awt.;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class Main extends JFrame implements ActionListener {private JTextField display;private double num1;private String operator;public Main() { initFrame(); initComponent(); } // 初始化窗口基础设置 private void initFrame() { setTitle(简易计算器 实验2); setSize(300, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setLayout(new BorderLayout(10, 10)); setResizable(false); // 删掉报错的 setBorder 行窗口不支持该方法 } // 初始化界面组件 private void initComponent() { // 顶部输入框 display new JTextField(); display.setFont(new Font(微软雅黑, Font.PLAIN, 24)); display.setHorizontalAlignment(JTextField.RIGHT); display.setEditable(false); add(display, BorderLayout.NORTH); // 按钮面板 4行4列网格布局 JPanel btnPanel new JPanel(); btnPanel.setLayout(new GridLayout(4, 4, 8, 8)); String[] btnText { 7, 8, 9, /, 4, 5, 6, *, 1, 2, 3, -, 0, ., , }; for (String text : btnText) { JButton btn new JButton(text); btn.setFont(new Font(微软雅黑, Font.BOLD, 18)); btn.addActionListener(this); btnPanel.add(btn); } add(btnPanel, BorderLayout.CENTER); // 底部功能按钮清空、退格 JPanel bottomPanel new JPanel(); bottomPanel.setLayout(new GridLayout(1, 2, 8, 8)); JButton btnClear new JButton(C 清空); JButton btnBack new JButton(← 退格); btnClear.addActionListener(this); btnBack.addActionListener(this); bottomPanel.add(btnClear); bottomPanel.add(btnBack); add(bottomPanel, BorderLayout.SOUTH); } // 按钮点击事件统一处理 Override public void actionPerformed(ActionEvent e) { String key e.getActionCommand(); // 数字和小数点 if ((key.compareTo(0) 0 key.compareTo(9) 0) || key.equals(.)) { display.setText(display.getText() key); } // 清空 else if (key.equals(C 清空)) { display.setText(); num1 0; operator null; } // 退格删除最后一位 else if (key.equals(← 退格)) { String text display.getText(); if (text.length() 0) { display.setText(text.substring(0, text.length() - 1)); } } // 运算符 - * / else if (key.equals() || key.equals(-) || key.equals(*) || key.equals(/)) { if (!display.getText().isEmpty()) { num1 Double.parseDouble(display.getText()); operator key; display.setText(); } } // 等于号计算结果 else if (key.equals()) { if (operator null || display.getText().isEmpty()) return; double num2 Double.parseDouble(display.getText()); double result 0; try { switch (operator) { case : result num1 num2; break; case -: result num1 - num2; break; case *: result num1 * num2; break; case /: if (num2 0) { JOptionPane.showMessageDialog(this, 错误不能除以0); display.setText(); operator null; return; } result num1 / num2; break; } // 去除末尾无效小数.0 if (result (long) result) { display.setText(String.valueOf((long) result)); } else { display.setText(String.valueOf(result)); } operator null; } catch (Exception ex) { JOptionPane.showMessageDialog(this, 输入数值有误); display.setText(); } } } public static void main(String[] args) { SwingUtilities.invokeLater(() - new Main().setVisible(true)); }}四、心得体会本次完成算术练习器与计算器两个 Swing 实验我将课堂上学到的图形界面理论付诸实践。通过搭建窗口、排布组件、编写监听事件我理清了 GUI 程序的运行逻辑熟练掌握了界面布局与交互功能的实现方法。编写过程中遇到不少编译与逻辑 bug在不断调试排错的过程中我加深了对 Swing 语法、数值转换和异常处理的理解。同时我认识到编写程序不能只考虑正常使用场景还要提前预判各类错误输入完善容错机制。两次实验综合运用循环、随机数、分支运算等知识点锻炼了我的逻辑思维。但我也发现自己处理复杂业务逻辑时不够熟练后续我会多加练习拓展程序附加功能巩固 Java 图形化开发相关知识。