MigLayout 11.0版本hidemode约束失效无法隐藏按钮问题
MigLayout 11.0 版本hidemode约束失效问题
我使用MigLayout已有一段时间,此前从未遇到过此类问题。近期开发中发现hidemode约束未正常生效,无法实现按钮组件的隐藏。
可复现代码
import java.awt.Container; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import net.miginfocom.swing.MigLayout; public class Builder extends JFrame { private final MigLayout migLayout = new MigLayout("debug, fillx", "[][]", ""); public Builder() { try { createAndShowGUI(); } catch (Throwable th) { th.printStackTrace(); Builder.this.dispatchEvent(new WindowEvent(Builder.this, WindowEvent.WINDOW_CLOSING)); } } private void createAndShowGUI() { Container container = getContentPane(); container.setLayout(migLayout); JButton b1 = new JButton("b1"); JButton b2 = new JButton("b2"); container.add(b1, "hidemode 1, alignx left"); container.add(b2, "alignx right"); pack(); setResizable(true); setTitle("Builder"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setVisible(true); } /** * @param args the command line arguments */ public static void main(String[] args) { new Builder(); } }
当前使用环境
- MigLayout 版本号:11.0
- 对应Maven依赖配置:
<dependency> <groupId>com.miglayout</groupId> <artifactId>miglayout-swing</artifactId> <version>11.0</version> </dependency>
问题原因与修复方法
这个问题是MigLayout 11.0版本的逻辑调整导致的:
- 从10.0版本开始,组件级别的
hidemode约束优先级低于全局布局的列/行尺寸锁定逻辑。当前代码里初始化布局时写死了两列配置[][],同时开启了fillx,布局会在首次渲染时锁定两列的初始宽度,后续组件可见性变化时不会重新计算列尺寸,导致hidemode配置失效。 - 部分场景下只配置hidemode但没有主动调用
setVisible(false)、也没有触发布局重绘,也会出现隐藏不生效的情况。
可根据需求选择以下修复方案:
- 全局配置hidemode:初始化MigLayout时直接把hidemode写到全局布局参数中,写法为
new MigLayout("debug, fillx, hidemode 1", "[][]", ""),全局配置优先级最高,不会被列计算逻辑覆盖。 - 调整列约束:如果只需要给单个组件配置hidemode,把固定列配置调整为弹性配置,比如将列参数从
"[][]"改为"[][grow]",给右侧列添加增长属性,布局就不会锁定初始列宽,组件隐藏时会自动重新计算尺寸。 - 主动触发布局刷新:在调用组件
setVisible(false)方法后,手动执行容器的重校验和重绘逻辑:b1.setVisible(false); container.revalidate(); container.repaint();
内容的提问来源于stack exchange,提问作者BabaNew
相关产品推荐
相关产品推荐

