Java Swing 多窗体交互实战解析:动态创建与关闭窗体
一、原题完整代码呈现
以下是计算机二级Java考试中关于Swing多窗体交互的典型题型,主要考察Swing包导入、类继承、组件添加、窗体显示及事件监听接口实现,包含5处需要填写的空白(标记为//*********Found**********
):
import java.awt.*;
import java.awt.event.*;
//*********Found**********
import ________________.swing.*;
//*********Found**********
public class Java_3 ___________ JPanel{
private int counter = 0;
private JButton closeAllButton;
public Java_3() {
JButton newButton = new JButton("New");
//*********Found**********
add(______________);
newButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
CloseFrame f = new CloseFrame();
counter++;
f.setTitle("窗体 " + counter);
f.setSize(200, 150);
f.setLocation(30 * counter, 30 * counter);
//*********Found**********
____________.setVisible(true);
closeAllButton.addActionListener(f);
}
});
closeAllButton = new JButton("Close all");
add(closeAllButton);
}
public static void main(String[ ] args) {
JFrame frame = new JFrame();
frame.setTitle("多窗体测试");
frame.setSize(300, 200);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Container contentPane = frame.getContentPane();
contentPane.add(new Java_3());
frame.setVisible(true) ;
}
}
//*********Found**********
class CloseFrame extends JFrame implements ________________ {
public void actionPerformed(ActionEvent evt) {
setVisible(false);
}
}
二、空白处逐一解析与解答
1. 第一处空白:导入Swing包
答案:javax
//*********Found**********
import javax.swing.*;
解析:
Swing组件(如JPanel
、JButton
、JFrame
)均位于javax.swing
包中。javax
是Java扩展包的命名空间,此处需要完整导入Swing包以使用相关组件,因此填写javax
。
2. 第二处空白:类继承声明
答案:extends
//*********Found**********
public class Java_3 extends JPanel{
解析: Java_3
类需要作为面板容器添加组件(按钮),因此需要继承JPanel
类。Java中类的继承使用extends
关键字,表明Java_3
是JPanel
的子类,可复用其组件容器功能。
3. 第三处空白:添加"New"按钮
答案:newButton
//*********Found**********
add(newButton);
解析: Java_3
继承自JPanel
,add()
方法用于向面板添加组件。newButton
是"New"按钮的引用,此处需要将其添加到面板才能在界面上显示,因此参数为newButton
。
4. 第四处空白:显示新窗体
答案:f
//*********Found**********
f.setVisible(true);
解析: f
是CloseFrame
类的实例(新窗体对象),setVisible(true)
方法用于显示窗体。创建新窗体后,需要调用该方法使其可见,因此填写窗体引用f
。
5. 第五处空白:实现事件监听接口
答案:ActionListener
//*********Found**********
class CloseFrame extends JFrame implements ActionListener {
解析: CloseFrame
类需要处理"Close all"按钮的点击事件(隐藏自身窗体),因此必须实现ActionListener
接口,并重写actionPerformed
方法。接口实现使用implements
关键字,填写ActionListener
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序实现多窗体的动态创建与批量关闭功能,核心功能包括:
- 主窗体包含"New"和"Close all"两个按钮
- 点击"New"按钮:创建新窗体,标题为"窗体 N"(N为序号),位置依次偏移,且新窗体注册到"Close all"按钮的事件监听
- 点击"Close all"按钮:所有通过"New"创建的窗体全部隐藏
运行说明
- 程序启动后,显示标题为"多窗体测试"的主窗体,包含两个按钮
点击"New"按钮:
- 生成标题为"窗体 1"的新窗体,位置在(30,30)
- 再次点击生成"窗体 2",位置在(60,60),以此类推
点击"Close all"按钮:
- 所有已创建的"窗体 N"会立即隐藏(主窗体保持显示)
- 点击主窗体的关闭按钮,程序完全退出
五、核心知识点总结
Swing组件与包结构
- 包路径:Swing组件位于
javax.swing
包,需通过import javax.swing.*;
导入 - 核心容器:
JPanel
作为面板容器用于组织按钮,JFrame
作为顶层窗体 - 组件继承:自定义容器类通过
extends JPanel
或extends JFrame
复用容器功能
- 包路径:Swing组件位于
事件监听的多重应用
- 匿名监听器:"New"按钮使用
new ActionListener(){...}
创建匿名内部类,处理窗体创建逻辑 - 接口实现:
CloseFrame
类实现ActionListener
接口,使每个窗体可响应"Close all"事件 - 事件注册:通过
closeAllButton.addActionListener(f)
将新窗体注册为事件监听器,实现批量控制
- 匿名监听器:"New"按钮使用
多窗体管理
- 动态创建:通过计数器
counter
跟踪窗体数量,设置不同标题和位置 - 位置控制:
setLocation(30 * counter, 30 * counter)
使新窗体依次偏移,避免重叠 - 批量操作:利用事件监听机制,让"Close all"按钮同时通知所有窗体执行隐藏操作
- 动态创建:通过计数器
窗体生命周期控制
- 显示窗体:
setVisible(true)
使窗体可见 - 隐藏窗体:
setVisible(false)
使窗体不可见(并非销毁) - 程序退出:主窗体通过
System.exit(0)
确保关闭时终止程序
- 显示窗体:
六、常见错误与应试技巧
常见错误分析
- 第一处空白包名错误:写成
java
或javaxs
,Swing正确包路径是javax.swing
- 第二处空白继承关键字错误:写成
implements
,JPanel
是类而非接口,必须用extends
- 第三处空白组件添加错误:写成
add("newButton")
(加引号导致添加字符串而非按钮) - 第四处空白窗体引用错误:写成
CloseFrame.setVisible(true)
(未使用实例引用) - 第五处空白接口名错误:写成
ActionLister
(拼写错误)或WindowListener
(不匹配事件类型)
- 第一处空白包名错误:写成
应试技巧
- Swing导入公式:
import javax.swing.*;
是使用Swing组件的标准导入语句 - 继承与实现区分:"类用
extends
,接口用implements
" - 组件添加原则:
add(组件引用)
,引用必须是已创建的组件对象 - 多窗体控制:通过事件监听将多个窗体与同一按钮绑定,实现批量操作
- 窗体可见性:记住
setVisible(true)
显示、false
隐藏的控制方式
- Swing导入公式:
通过本题,我们掌握了Swing中多窗体的创建、布局和事件联动的方法,理解了继承、接口实现和匿名内部类在GUI编程中的综合应用。这类题目在实际开发中常用于多文档界面(MDI)、工具窗口集等场景,考察对面向对象思想和事件驱动模型的掌握,是Java GUI编程的重要进阶知识点。