调用setResizable(false)仍无法阻止双击标题栏还原最大化JFrame
问题根因
setResizable(false)仅会禁用窗体边缘拖拽调整逻辑、灰化标题栏的还原/大小调整按钮,Windows平台原生标题栏的双击触发还原的逻辑是独立于Swing的resizable配置的,Java Swing默认不会拦截该原生事件,因此会出现双击标题栏触发还原的异常现象。
最优解决方案(兼容性最强,改造成本最低)
直接给JFrame添加窗体状态监听器,强制保持最大化状态,无论用户通过什么操作触发还原,都会自动拉回最大化状态,兼容Windows 10 + Java 11运行环境:
// 原有配置保留 this.setResizable(false); this.setExtendedState(JFrame.MAXIMIZED_BOTH); // 新增状态监听逻辑,放在setVisible(true)之前即可 this.addWindowStateListener(e -> { if ((e.getNewState() & JFrame.MAXIMIZED_BOTH) != JFrame.MAXIMIZED_BOTH) { this.setExtendedState(JFrame.MAXIMIZED_BOTH); } });
该方案不会影响现有其他业务逻辑,不需要调整原有UI结构。
可选方案(彻底禁用双击标题栏能力)
如果本身有自定义标题栏样式的需求,也可以禁用系统原生标题栏,从根源上消除双击触发还原的入口:
// 禁用系统原生装饰 this.setUndecorated(true); // 自行实现自定义标题栏UI,包含你需要的标题文本、最小化/关闭按钮、拖拽移动逻辑即可
内容的提问来源于stack exchange,提问作者Bu Saeed
相关产品推荐
相关产品推荐

