为什么设置了JPanel尺寸后,使用BoxLayout时布局大小仍会发生变化?
问题原因及修改方案
核心问题梳理
代码的问题集中在尺寸规则设置和布局刷新逻辑不符合BoxLayout的布局规则:
- BoxLayout布局会严格参考组件的
minimumSize、preferredSize、maximumSize三个参数,实际渲染尺寸不会超过最大尺寸的限制 - 修改组件尺寸后没有触发布局重算,修改不生效
- 布局设置和组件添加的顺序错误,初始布局异常
- 子组件(MenuButton)尺寸写死,父容器resize后不会同步适配
具体修改点
修复AppPanel的尺寸设置
构造方法中最大尺寸的配置错误,原本设置为占宽1/4,和你期望的3/4宽度不符:// AppPanel构造方法内修改 this.setMinimumSize(new Dimension(3 * this.Width/ 4, this.Height)); this.setPreferredSize(new Dimension(3 * this.Width/ 4, this.Height)); this.setMaximumSize(new Dimension(3 * this.Width/ 4, this.Height)); // 原来错写为this.Width/4同时修改AppPanel的update方法,同步更新三个尺寸并触发重绘:
public void update(int width, int height){ this.Width = width; this.Height = height; this.setMinimumSize(new Dimension(3 * this.Width/ 4, this.Height)); this.setPreferredSize(new Dimension(3 * this.Width/ 4, this.Height)); this.setMaximumSize(new Dimension(3 * this.Width/ 4, this.Height)); this.mb.updateSize(this.getPreferredSize()); this.revalidate(); this.repaint(); }修复MenuPanel的逻辑错误
原update方法错误将MenuPanel的宽度设为3/4,不符合左侧菜单占1/4的需求,修改update方法:public void update(int width, int height){ this.Width = width; this.Height = height; this.setMinimumSize(new Dimension(this.Width/ 4, this.Height)); this.setPreferredSize(new Dimension(this.Width/ 4, this.Height)); this.setMaximumSize(new Dimension(this.Width/ 4, this.Height)); this.mb.updateSize(this.getPreferredSize()); this.revalidate(); this.repaint(); }给MenuButton新增尺寸更新方法
适配父容器resize后的宽度变化:// 新增到MenuButton类中 public void updateSize(Dimension parentSize) { int newWidth = (int) parentSize.getWidth() - 20; this.setMinimumSize(new Dimension(newWidth,40)); this.setMaximumSize(new Dimension(newWidth,40)); this.setPreferredSize(new Dimension(newWidth,40)); this.revalidate(); }调整MainFrame的布局设置顺序
先设置布局再添加组件,避免初始布局异常:// MainFrame构造方法内调整顺序 this.getContentPane().setLayout(new BoxLayout(this.getContentPane(),BoxLayout.X_AXIS)); this.add(mp); this.add(ap); addComponentListener(this);
修改完成后运行即可实现左侧1/4宽度黑底菜单、右侧3/4宽度绿底内容区的预期效果,窗口缩放时两个区域会按1:3的比例自动适配。
内容的提问来源于stack exchange,提问作者Aravind K
相关产品推荐
相关产品推荐

