Java Swing Swing 多窗口交互实战解析:事件监听与窗口管理
一、原题完整代码呈现
以下是计算机二级 Java 考试中关于 Swing 多窗口交互的典型题型,包含 4 处需要填写的空白(标记为 //*********Found**********
):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Java_3{
public static void main(String[] args){
MulticastFrame frame = new MulticastFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
class MulticastFrame extends JFrame{
public MulticastFrame(){
setTitle("MulticastTest");
setSize(WIDTH, HEIGHT);
MulticastPanel panel = new MulticastPanel();
Container contentPane = getContentPane();
//*********Found**********
contentPane.add(_________________);
}
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
}
class MulticastPanel extends JPanel{
public MulticastPanel(){
JButton newButton = new JButton("New");
add(newButton);
ActionListener newListener = new ActionListener(){
public void actionPerformed(ActionEvent event){
makeNewFrame();
}
};
newButton.addActionListener(newListener);
closeAllButton = new JButton("Close all");
add(closeAllButton);
}
private void makeNewFrame(){
final BlankFrame frame = new BlankFrame();
frame.show();
ActionListener closeAllListener = new ActionListener(){
public void actionPerformed(ActionEvent event){
//*********Found**********
frame.___________________(); //使窗口隐藏或消除
}
};
//*********Found**********
closeAllButton.addActionListener(__________________________________);
}
private JButton closeAllButton;
}
class BlankFrame extends JFrame{
public BlankFrame(){
//*********Found**********
______________ ++ ;
setTitle("Frame " + counter);
setSize(WIDTH, HEIGHT);
setLocation(SPACING * counter, SPACING * counter);
}
public static final int WIDTH = 200;
public static final int HEIGHT = 150;
public static final int SPACING = 30;
private static int counter = 0;
}
二、空白处逐一解析与解答
1. 第一处空白:添加面板到内容面板
答案:panel
//*********Found**********
contentPane.add(panel);
解析:
在 Swing 中,JFrame
的内容面板(contentPane
)是添加组件的主要容器。前面已经创建了 MulticastPanel
实例 panel
,此处需要将这个面板添加到内容面板中,才能在窗口中显示面板及其包含的组件。
2. 第二处空白:关闭窗口的方法
答案:dispose
//*********Found**********
frame.dispose(); //使窗口隐藏或消除
解析: JFrame
的 dispose()
方法用于释放窗口所占用的资源并关闭窗口,符合“使窗口隐藏或消除”的需求。与 setVisible(false)
仅隐藏窗口不同,dispose()
会彻底释放资源,是关闭窗口的推荐方式。
3. 第三处空白:为关闭按钮添加监听器
答案:closeAllListener
//*********Found**********
closeAllButton.addActionListener(closeAllListener);
解析:
前面已经创建了 ActionListener
实例 closeAllListener
,用于定义点击“Close all”按钮时的行为(关闭窗口)。此处需要通过 addActionListener
方法将该监听器绑定到 closeAllButton
上,实现按钮与事件处理逻辑的关联。
4. 第四处空白:静态计数器自增
答案:counter
//*********Found**********
counter ++ ;
解析: BlankFrame
类中定义了静态变量 counter
(计数器),用于记录创建的窗口数量并在标题中显示。在构造方法中,每次创建 BlankFrame
实例时,需要将 counter
自增,以保证每个窗口的标题编号唯一(如“Frame 1”“Frame 2”等)。
三、完整正确代码
四、程序功能与运行效果
程序功能
该程序实现了一个多窗口管理系统,核心功能包括:
- 主窗口(
MulticastFrame
)包含两个按钮:“New”用于创建新窗口,“Close all”用于关闭当前创建的窗口。 - 点击“New”按钮时,会创建一个标题为“Frame X”(X 为序号)的新窗口(
BlankFrame
),且窗口位置依次偏移,避免重叠。 - 点击“Close all”按钮时,会关闭当前创建的新窗口。
运行效果
- 启动程序后,显示主窗口“MulticastTest”,内含“New”和“Close all”按钮。
- 点击“New”按钮,会弹出标题为“Frame 1”的窗口,位置在 (30, 30)。
- 再次点击“New”按钮,弹出“Frame 2”,位置在 (60, 60),以此类推。
- 点击“Close all”按钮,当前创建的窗口会被关闭。
五、核心知识点总结
Swing 窗口层次结构
- 顶级容器:
JFrame
是独立的窗口,包含标题栏、边框和内容面板。 - 中间容器:
JPanel
用于组织组件,需添加到顶级容器的内容面板中才能显示。 - 组件添加:通过
contentPane.add(组件)
方法将组件添加到窗口。
- 顶级容器:
事件监听机制
- 事件源:如
JButton
,是触发事件的组件。 - 监听器:如
ActionListener
,定义事件发生时的处理逻辑。 - 绑定关系:通过
addActionListener(监听器)
方法将事件源与监听器关联。
- 事件源:如
多窗口管理
- 窗口创建:通过
new 窗口类()
实例化新窗口,调用show()
或setVisible(true)
显示。 - 窗口关闭:
dispose()
方法用于关闭窗口并释放资源,区别于仅隐藏窗口的setVisible(false)
。 - 静态计数器:使用
static
变量(如counter
)记录窗口数量,实现标题和位置的动态变化。
- 窗口创建:通过
布局与位置控制
- 窗口大小:通过
setSize(宽, 高)
设置。 - 窗口位置:通过
setLocation(x, y)
设置,本例中利用计数器实现位置偏移(SPACING * counter
)。
- 窗口大小:通过
六、常见错误与应试技巧
常见错误分析
- 第一处空白添加错误组件:误填
newButton
或closeAllButton
,忽略了面板是组件的容器,应添加面板而非单个按钮。 - 第二处空白使用
close()
方法:JFrame
中没有close()
方法,关闭窗口需用dispose()
或setDefaultCloseOperation()
。 - 第三处空白重复创建监听器:误写为
new ActionListener(){...}
,未使用已定义的closeAllListener
。 - 第四处空白误用实例变量:
counter
是静态变量,直接通过变量名访问即可,无需实例化对象。
- 第一处空白添加错误组件:误填
应试技巧
- 组件添加规律:面板通常作为一个整体添加到窗口的内容面板,而非单独添加面板内的组件。
- 事件监听模板:
事件源.addActionListener(监听器实例)
是绑定事件的固定格式。 - 静态变量用途:静态变量可用于在类的所有实例间共享数据(如本例中的窗口计数器)。
- 窗口操作方法:记住
dispose()
关闭窗口、setVisible(true)
显示窗口的核心方法。
通过本题,我们掌握了 Swing 多窗口交互的核心技术,包括组件添加、事件监听、窗口管理和静态变量的应用。这些知识点是 Java 桌面应用开发的基础,在实际项目中,多窗口交互常用于实现主界面与子窗口、对话框的通信,也是计算机二级 Java 考试中 GUI 部分的重点考察内容。