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

Java Swing Swing 多窗口交互实战解析:事件监听与窗口管理

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

Java Swing Swing 多窗口交互实战解析:事件监听与窗口管理

一、原题完整代码呈现

23.png

以下是计算机二级 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();     //使窗口隐藏或消除

解析
JFramedispose() 方法用于释放窗口所占用的资源并关闭窗口,符合“使窗口隐藏或消除”的需求。与 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”等)。

三、完整正确代码

四、程序功能与运行效果

程序功能

该程序实现了一个多窗口管理系统,核心功能包括:

  1. 主窗口(MulticastFrame)包含两个按钮:“New”用于创建新窗口,“Close all”用于关闭当前创建的窗口。
  2. 点击“New”按钮时,会创建一个标题为“Frame X”(X 为序号)的新窗口(BlankFrame),且窗口位置依次偏移,避免重叠。
  3. 点击“Close all”按钮时,会关闭当前创建的新窗口。
运行效果
  1. 启动程序后,显示主窗口“MulticastTest”,内含“New”和“Close all”按钮。
  2. 点击“New”按钮,会弹出标题为“Frame 1”的窗口,位置在 (30, 30)。
  3. 再次点击“New”按钮,弹出“Frame 2”,位置在 (60, 60),以此类推。
  4. 点击“Close all”按钮,当前创建的窗口会被关闭。

五、核心知识点总结

  1. Swing 窗口层次结构

    • 顶级容器:JFrame 是独立的窗口,包含标题栏、边框和内容面板。
    • 中间容器:JPanel 用于组织组件,需添加到顶级容器的内容面板中才能显示。
    • 组件添加:通过 contentPane.add(组件) 方法将组件添加到窗口。
  2. 事件监听机制

    • 事件源:如 JButton,是触发事件的组件。
    • 监听器:如 ActionListener,定义事件发生时的处理逻辑。
    • 绑定关系:通过 addActionListener(监听器) 方法将事件源与监听器关联。
  3. 多窗口管理

    • 窗口创建:通过 new 窗口类() 实例化新窗口,调用 show()setVisible(true) 显示。
    • 窗口关闭:dispose() 方法用于关闭窗口并释放资源,区别于仅隐藏窗口的 setVisible(false)
    • 静态计数器:使用 static 变量(如 counter)记录窗口数量,实现标题和位置的动态变化。
  4. 布局与位置控制

    • 窗口大小:通过 setSize(宽, 高) 设置。
    • 窗口位置:通过 setLocation(x, y) 设置,本例中利用计数器实现位置偏移(SPACING * counter)。

六、常见错误与应试技巧

  1. 常见错误分析

    • 第一处空白添加错误组件:误填 newButtoncloseAllButton,忽略了面板是组件的容器,应添加面板而非单个按钮。
    • 第二处空白使用 close() 方法:JFrame 中没有 close() 方法,关闭窗口需用 dispose()setDefaultCloseOperation()
    • 第三处空白重复创建监听器:误写为 new ActionListener(){...},未使用已定义的 closeAllListener
    • 第四处空白误用实例变量:counter 是静态变量,直接通过变量名访问即可,无需实例化对象。
  2. 应试技巧

    • 组件添加规律:面板通常作为一个整体添加到窗口的内容面板,而非单独添加面板内的组件。
    • 事件监听模板:事件源.addActionListener(监听器实例) 是绑定事件的固定格式。
    • 静态变量用途:静态变量可用于在类的所有实例间共享数据(如本例中的窗口计数器)。
    • 窗口操作方法:记住 dispose() 关闭窗口、setVisible(true) 显示窗口的核心方法。

通过本题,我们掌握了 Swing 多窗口交互的核心技术,包括组件添加、事件监听、窗口管理和静态变量的应用。这些知识点是 Java 桌面应用开发的基础,在实际项目中,多窗口交互常用于实现主界面与子窗口、对话框的通信,也是计算机二级 Java 考试中 GUI 部分的重点考察内容。

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