Java Swing 简易加减计算器实现:事件监听与界面布局详解
一、题目代码分析
以下是需要补全的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的事件处理遵循“监听器模式”,核心流程:
- 定义监听器类:实现
ActionListener
接口,重写actionPerformed(ActionEvent e)
方法(事件触发时执行)。 - 绑定监听器:通过
组件.addActionListener(监听器实例)
为按钮绑定监听器。 - 获取事件源:通过
e.getSource()
判断触发事件的组件(如区分“加”“减”按钮)。
本例中使用内部类BListener实现监听器,优势是可以直接访问外部类(MyPanel
)的成员变量(如t1
、l3
),无需通过参数传递,代码更简洁。
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程序(如文本编辑器、数据可视化工具)奠定基础。