何使用外部按钮关闭一个JInternalFrame时,监听该InternalFrame关闭的Listener无效?
import javax.swing.*;
import mdi.MDIFrame.InnerFrame;
import java.awt.event.*;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
class MDITest extends JFrame implements ActionListener
{
JDesktopPane desktopPane;
JPanel p;
JButton b1;
JButton b2;
int count = 1;
public MDITest()
{
super("MDITest Frame");
Container contentPane = this.getContentPane();
contentPane.setLayout(new BorderLayout());
/*
* 建立一个新的JDesktopPane并加入于contentPane中
*/
desktopPane = new JDesktopPane();
contentPane.add(desktopPane);
p = new JPanel(new FlowLayout());
contentPane.add(p, BorderLayout.SOUTH);
b1 = new JButton("Create New Internal Frames");
b1.addActionListener(this);// 当用户按下按钮时,将运行actionPerformed()中的程序
p.add(b1);
b2 = new JButton("Close Selected Frame");
b2.addActionListener(this);//
p.add(b2);
setSize(500, 400);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
this.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == b1)
{
/*
* 产生一个可关闭、可改变大小、具有标题、可最大化与最小化的Internal Frame.
*/
JInternalFrame internalFrame = new JInternalFrame("Internal Frame " + (count++), true, true, true, true);
internalFrame.setLocation(20, 20);
internalFrame.setSize(300, 300);
internalFrame.setVisible(true);
// 将JInternalFrame加入JDesktopPane中
desktopPane.add(internalFrame);
try
{
internalFrame.setSelected(true);
}
catch (java.beans.PropertyVetoException ex)
{
System.out.println("Exception while selecting");
}
// 向侦听器列表添加一个 VetoableChangeListener。为所有属性注册该侦听器
internalFrame.addVetoableChangeListener(new VetoableChangeListener()
{
public void vetoableChange(PropertyChangeEvent e) throws PropertyVetoException
{
JInternalFrame frame = (JInternalFrame) e.getSource();
String name = e.getPropertyName();
Object value = e.getNewValue();
if (name.equals("closed") && value.equals(Boolean.TRUE))// 窗口被关闭
{
System.out.println("窗口被关闭");
}
}
});
}
else if (e.getSource() == b2)
{
// 返回此 JDesktopPane 中当前活动的JInternalFrame
JInternalFrame iframe = desktopPane.getSelectedFrame();
if (iframe != null)
{
iframe.dispose();
}
}
}
public static void main(String[] args)
{
new MDITest();
}
}
如果直接使用InternalFrame右上角自带的“关闭”按钮关闭该InternalFrame的话,每次都可以监听到该InternalFrame被关闭的事件,即"窗口被关闭"每次都可以正常被打印输出。
而当使用外部按钮(代码中的b2按钮)关闭一个JInternalFrame时,监听该Frame关闭的Listener无效,没有任何打印输出!请问该如何解决这个问题?
相关推荐
Microsoft.WinDbg-1.2610.1001.0-x64
Microsoft.WinDbg-1.2610.1001.0-x64
Claude 代码超强能力:核心技能库
Superpowers 是一套面向你的编码智能体的完整软件开发方法论,由一组可组合技能和若干初始指令构建而成,用以确保智能体真正使用这些技能。
PDF发票内容提取排版并结构化导出xlsx/cvs嵌入式ptyhon
【本地发票提取工具】 核心优势:不依赖传统粗糙 OCR,基于文字排版结构进行精准提取。仅“税网”下载及税网邮件发送的原版 PDF 发票(开票软件发送的不太支持)能实现开票明细级的秒级本地提取,告别只能提抬头、总额的尴尬。 可免费试用 3 天! 【用前须知】 去微软官网下载VC_redist.x64.exe运行修复运行库(必要的前置操作),之后再解压本工具rar,运行本exe即可。 VC_redist.x64.exe官网永久下载地址 https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redist 【安全须知】 个人开发暂未做代码签名,杀软可能会有误报拦截。遇到拦截请在杀软中添加信任/白名单即可。 VirusTotal扫描结果 2/61,主流杀软均通过,个别引擎因无签名误报。官网 virustotal.com 点击页面中间显眼的 “Choose file”(选择文件)按钮上传扫描。
Flask校园二手交易平台课设
这是一份基于 Flask + SQLite 的校园二手交易平台课程设计完整资料,包含实验报告(Markdown、HTML、PDF 三种格式)、全部 Python 源码、8 个 Jinja2 页面模板、5 张运行截图、答辩 PPT。学生注册账号后发布闲置物品,同校同学按分类翻、按关键词搜,看中了在详情页留言咨询,管理员能下架违规商品。不接支付不做物流,买卖双方线下交易,平台只负责信息展示和沟通,一个学期课设能做完。 系统功能:用户注册登录登出,session 维持登录态;发布商品填标题、描述、价格、选六类分类,图片可选上传不强制;首页卡片网格展示在售商品,顶部搜索框按标题描述模糊匹配,下方分类按钮筛选,搜索和筛选可组合;商品详情页展示大图、完整描述、卖家昵称,登录用户能留言咨询;我的发布页能看自己挂过的所有商品并删除;管理员后台能看全部商品,一键下架违规品或恢复在售。 几个值得参考的实现点:密码用 Werkzeug 哈希加盐存储;登录接口不区分"用户不存在"和"密码错误",防枚举用户名;图片上传限制后缀和 2MB,文件名随机串重命名,防覆盖和传脚本;分类和搜索筛选组合用动态拼 SQL;首次启动自动建表写管理员账号;Bootstrap 5 栅格,手机浏览器也能看。 适合正在做 Web 课程设计、Python 后端入门的学生,以及想学习"Flask 蓝图 + SQLite + 登录鉴权 + 文件上传"完整小项目的自学者。拿到手后 cd src,pip install -r requirements.txt,python app.py,浏览器开 http://127.0.0.1:5000 即可,管理员账号 admin/admin123,普通用户自行注册。
《低秩加稀疏模型的高效动态平行MRI重建.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。


Java SE
