Java Swing中无法修改JTextField宽度的问题求助
JTextField设置PreferredSize后宽度不生效的解决办法
你遇到的问题核心不是getPreferredSize的重写有问题,而是Swing的布局管理器会根据自身规则调整组件尺寸,导致你设置的宽度被覆盖。
常见原因
如果你的JTextField放在以下布局场景中,宽度会被强制拉伸:
- 放在
BorderLayout.CENTER区域:该区域的组件会自动填满容器的水平和垂直空间 - 用
GridBagLayout时,GridBagConstraints.fill设为HORIZONTAL或BOTH:组件会拉伸适配列宽 - 用
BoxLayout.X_AXIS:组件会被拉伸填满水平空间
解决方法
- 调整布局约束
- 若用BorderLayout,把JTextField放在
EAST/WEST/NORTH/SOUTH区域,这些区域会尊重组件的首选宽度 - 若用GridBagLayout,设置
GridBagConstraints.fill = GridBagConstraints.NONE,同时weightx = 0,这样布局管理器不会强制拉伸组件宽度
- 若用BorderLayout,把JTextField放在
- 验证布局容器
把JTextField先放在一个用FlowLayout的JPanel里,再添加到主容器,FlowLayout默认会尊重组件的首选尺寸,这样你设置的200宽度就会生效 - 替代写法
不用重写方法,直接调用setPreferredSize(new Dimension(200, 40)),效果和重写一致,核心还是要配合合适的布局
你的代码本身是正确的:
cal = new JTextField("0"){ @Override public Dimension getPreferredSize(){ return new Dimension(200, 40); } };
问题出在组件所在的布局环境,只要调整布局规则,宽度就能正常生效。
内容的提问来源于stack exchange,提问作者Amatul Uzma
相关产品推荐
相关产品推荐

