Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程

Java Swing 简易加减计算器实现:事件监听与界面布局详解

阿贵
10月1日发布 /正在检测是否收录...
温馨提示:
本文最后更新于2025年10月01日,已超过11天没有更新,若内容或图片失效,请留言反馈。

Java Swing 简易加减计算器实现:事件监听与界面布局详解

140.png
141.png

一、题目代码分析

以下是需要补全的Java Swing代码,核心功能是创建一个可视化加减计算器,支持输入两个整数,通过“加/减”按钮计算结果并显示。代码包含界面组件初始化、布局管理和事件处理三大模块:

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

public class Java_3 {
    public static void main(String[] args) {
        JFrame f = new JFrame("计算");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MyPanel());
        f.setSize(300, 130);
       //**********Found**********
        f.setVisible(_________);
    }
}

class MyPanel extends JPanel {
    JTextField t1, t2; // 输入框1、输入框2
    JButton b1, b2;    // 加按钮、减按钮
    JLabel l1, l3;     // 运算符标签、结果标签
    MyPanel() {
        setLayout(new BorderLayout());
        t1 = new JTextField(5);
        t2 = new JTextField(5);
        l1 = new JLabel("op"); // 初始显示"op",计算时更新为"+/-"
        JLabel l2 = new JLabel("=");
        l3 = new JLabel("00"); // 初始结果显示"00"
        JPanel p1 = new JPanel(); // 北部面板:放输入框和标签
        p1.add(t1);
        p1.add(l1);
        p1.add(t2);
        p1.add(l2);
        p1.add(l3);
        JPanel p2 = new JPanel(); // 南部面板:放功能按钮
        b1 = new JButton("加");
        b2 = new JButton("减");
        p2.add(b1);
        p2.add(b2);
        add(p1, BorderLayout.CENTER); // 北部面板放中间
        //**********Found**********
        add(_________, BorderLayout.SOUTH); // 南部面板放下方
       //**********Found**********
        b1.addActionListener(new _________() ); // 为加按钮加监听器
       //**********Found**********
        b2.addActionListener(new _________() ); // 为减按钮加监听器
    }

    //**********Found**********
    private class BListener implements _________ {    // 事件监听器内部类
        public void actionPerformed(ActionEvent e) {
            int a = 0, b = 0;
            try {
                 //**********Found**********
                a = Integer.parseInt(_________() ); // 读取输入框1内容
                 //**********Found**********
                b = Integer.parseInt(_________() ); // 读取输入框2内容
            } catch (Exception ee) {
                // 捕获非整数输入异常,默认a、b为0
            }
            //**********Found**********
            if (e._________() == b1) { // 判断点击的是哪个按钮
                l1.setText("+"); // 更新运算符标签为"+"
                l3.setText(String.valueOf(a+b)); // 计算并显示加法结果
            } else {
                l1.setText("-"); // 更新运算符标签为"-"
                l3.setText(String.valueOf(a-b)); // 计算并显示减法结果
            }
        }
    }
}

二、空白处逐一解析

要完成计算器的核心功能,需围绕“界面显示”“布局组装”“事件监听”三个核心目标,逐个突破空白:

1. 第一个空白:f.setVisible(_________);

  • 解析JFrame(窗口)默认是隐藏的,需调用setVisible(boolean flag)设置为可见。要显示窗口,参数需为true
  • 答案true

2. 第二个空白:add(_________, BorderLayout.SOUTH);

  • 解析:代码中已创建JPanel p2(存放“加/减”按钮的面板),需将其添加到主面板的南部(SOUTH) 位置,与北部的输入面板(p1)上下呼应。
  • 答案p2

3. 第三个/第四个空白:b1.addActionListener(new _________() );

  • 解析:Swing按钮需要通过addActionListener()绑定事件监听器才能响应点击。代码中已定义内部类BListener(实现了监听器接口),需创建BListener实例作为参数。
  • 答案BListener(两个空白答案相同,均为BListener

4. 第五个空白:private class BListener implements _________ {

  • 解析:事件监听器类必须实现ActionListener接口(这是Swing处理动作事件的标准接口),并强制重写actionPerformed(ActionEvent e)方法。
  • 答案ActionListener

5. 第六个空白:a = Integer.parseInt(_________() );

  • 解析t1是输入第一个数字的JTextField(文本框),需通过getText()方法获取文本框中的字符串内容,再转换为整数。
  • 答案t1.getText

6. 第七个空白:b = Integer.parseInt(_________() );

  • 解析:与第六个空白逻辑一致,t2是输入第二个数字的文本框,需调用getText()获取其内容。
  • 答案t2.getText

7. 第八个空白:if (e._________() == b1) {

  • 解析ActionEvent对象e包含事件源信息,需通过getSource()方法获取触发事件的组件(即点击的按钮),再与b1(加按钮)比较,判断用户点击的是哪个按钮。
  • 答案getSource

三、完整正确代码

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

public class Java_3 {
    public static void main(String[] args) {
        JFrame f = new JFrame("计算");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MyPanel());
        f.setSize(300, 130);
        // 设置窗口可见
        f.setVisible(true);
    }
}

class MyPanel extends JPanel {
    JTextField t1, t2; // 输入框:分别输入两个运算数
    JButton b1, b2;    // 功能按钮:加、减
    JLabel l1, l3;     // 标签:显示运算符、计算结果

    MyPanel() {
        setLayout(new BorderLayout()); // 主面板用边界布局

        // 初始化输入相关组件
        t1 = new JTextField(5);  // 输入框1,宽度5个字符
        t2 = new JTextField(5);  // 输入框2,宽度5个字符
        l1 = new JLabel("op");   // 运算符标签,初始显示"op"
        JLabel l2 = new JLabel("="); // 等号标签
        l3 = new JLabel("00");   // 结果标签,初始显示"00"

        // 面板p1:存放输入框和标签(中间区域)
        JPanel p1 = new JPanel();
        p1.add(t1);
        p1.add(l1);
        p1.add(t2);
        p1.add(l2);
        p1.add(l3);

        // 面板p2:存放功能按钮(南部区域)
        JPanel p2 = new JPanel();
        b1 = new JButton("加");
        b2 = new JButton("减");
        p2.add(b1);
        p2.add(b2);

        // 组装主面板:p1放中间,p2放下方
        add(p1, BorderLayout.CENTER);
        add(p2, BorderLayout.SOUTH);

        // 为按钮绑定事件监听器
        b1.addActionListener(new BListener());
        b2.addActionListener(new BListener());
    }

    // 内部类:事件监听器,处理按钮点击逻辑
    private class BListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int a = 0, b = 0;
            try {
                // 读取输入框内容并转换为整数(处理非整数输入异常)
                a = Integer.parseInt(t1.getText());
                b = Integer.parseInt(t2.getText());
            } catch (Exception ee) {
                // 若输入非整数,a、b默认保持0
                JOptionPane.showMessageDialog(null, "请输入有效的整数!", "输入错误", JOptionPane.ERROR_MESSAGE);
            }

            // 判断点击的是加按钮还是减按钮
            if (e.getSource() == b1) {
                l1.setText("+"); // 更新运算符为"+"
                l3.setText(String.valueOf(a + b)); // 计算并显示加法结果
            } else {
                l1.setText("-"); // 更新运算符为"-"
                l3.setText(String.valueOf(a - b)); // 计算并显示减法结果
            }
        }
    }
}
注:优化了原代码的异常处理,添加JOptionPane弹窗提示输入错误,提升用户体验。

四、代码运行示例

1. 界面初始状态

窗口标题为“计算”,中间区域显示:[输入框1] op [输入框2] = 00,下方显示“加”“减”两个按钮。

2. 加法操作

  • 在输入框1输入10,输入框2输入5
  • 点击“加”按钮:运算符标签变为“+”,结果标签显示15
  • 界面显示:[10] + [5] = 15

3. 减法操作

  • 在输入框1输入20,输入框2输入8
  • 点击“减”按钮:运算符标签变为“-”,结果标签显示12
  • 界面显示:[20] - [8] = 12

4. 错误处理

  • 若输入非整数(如“abc”),点击按钮后弹出弹窗提示“请输入有效的整数!”

五、核心知识点总结

通过这个计算器实例,可系统掌握Java Swing的3个核心技术点:

1. Swing界面布局管理(BorderLayout)

BorderLayout(边界布局)是Swing常用布局之一,将容器分为5个区域:北(NORTH)、南(SOUTH)、东(EAST)、西(WEST)、中(CENTER),本例中:

  • 中间区域(CENTER):存放输入框和标签的面板p1,自动填充剩余空间
  • 南部区域(SOUTH):存放功能按钮的面板p2,固定在下方

布局优势:结构清晰,适配窗口大小变化,适合分区域组装界面。

2. 事件监听机制(ActionListener)

Swing的事件处理遵循“监听器模式”,核心流程:

  1. 定义监听器类:实现ActionListener接口,重写actionPerformed(ActionEvent e)方法(事件触发时执行)。
  2. 绑定监听器:通过组件.addActionListener(监听器实例)为按钮绑定监听器。
  3. 获取事件源:通过e.getSource()判断触发事件的组件(如区分“加”“减”按钮)。

本例中使用内部类BListener实现监听器,优势是可以直接访问外部类(MyPanel)的成员变量(如t1l3),无需通过参数传递,代码更简洁。

3. 组件交互与数据处理

  • 文本框(JTextField):通过getText()获取用户输入的字符串,setText()设置内容。
  • 标签(JLabel):通过setText()更新显示内容(如运算符、结果)。
  • 异常处理:用try-catch捕获Integer.parseInt()的转换异常(处理非整数输入),避免程序崩溃。

六、拓展与优化建议

本例是基础加减计算器,可从以下方向扩展功能,提升实用性:

1. 增加更多运算(乘、除、取余)

  • 新增“乘”“除”按钮,在BListener中添加对应的判断逻辑和计算方法。
  • 除法需处理除数为0的异常:

    else if (e.getSource() == b3) { // 乘按钮
        l1.setText("×");
        l3.setText(String.valueOf(a * b));
    } else if (e.getSource() == b4) { // 除按钮
        if (b == 0) {
            l3.setText("错误");
            JOptionPane.showMessageDialog(null, "除数不能为0!", "计算错误", JOptionPane.ERROR_MESSAGE);
        } else {
            l1.setText("÷");
            l3.setText(String.valueOf((double)a / b)); // 保留小数
        }
    }

2. 优化界面美观度

  • 设置字体:为组件统一设置字体,避免默认字体过小:

    Font font = new Font("宋体", Font.PLAIN, 14);
    t1.setFont(font);
    l1.setFont(font);
    b1.setFont(font);
  • 调整窗口位置:设置窗口居中显示:

    f.setLocationRelativeTo(null); // 窗口居中

3. 支持连续计算

  • 新增“清空”按钮,点击后重置输入框和结果标签:

    JButton b5 = new JButton("清空");
    b5.addActionListener(e -> {
        t1.setText("");
        t2.setText("");
        l1.setText("op");
        l3.setText("00");
    });

通过本例的学习,不仅能掌握Swing界面开发的基础流程,更能理解面向对象编程中“组件解耦”“事件驱动”的设计思想——这些思想在Java桌面应用开发中具有普遍适用性,为后续开发更复杂的GUI程序(如文本编辑器、数据可视化工具)奠定基础。

喜欢就支持一下吧
点赞 1 分享 收藏
评论 抢沙发
OωO
取消 登录评论