Java Swing如何在同一JPanel中均匀放置两个水平排列的JTextField
问题原因
你当前使用的BorderLayout布局规则中,WEST和EAST区域的宽度完全由子组件自身的preferredSize决定,未配置参数的JTextField默认首选宽度不符合预期,才会出现宽度分配异常的问题。
解决方案
推荐两种常用的实现方式:
方案1:使用GridLayout(最简单,适配均分需求)
GridLayout会自动将容器区域平均分配给所有子组件,1行2列的配置刚好满足两个输入框水平均分的需求:
public static void main(String args[]) { JFrame frame = new JFrame("GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 改成1行2列的GridLayout,组件自动均分宽度 JPanel panel = new JPanel(new GridLayout(1, 2, 2, 0)); // 后两个参数是水平、垂直间距,可自行调整 JTextField tickerField = new JTextField(); JTextField shareField = new JTextField(); panel.add(tickerField); panel.add(shareField); frame.add(panel, BorderLayout.NORTH); frame.setSize(250, 150); frame.setVisible(true); }
该方案代码逻辑简单,无论窗口如何拉伸,两个输入框始终保持宽度相等。
方案2:使用GridBagLayout(更灵活,支持后续扩展)
如果后续需要在同一行新增其他组件,或者自定义宽度分配比例,可以用GridBagLayout配置权重参数实现均分:
public static void main(String args[]) { JFrame frame = new JFrame("GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.weightx = 1.0; // 两个组件权重相同,平分宽度 gbc.fill = GridBagConstraints.HORIZONTAL; // 水平方向填满分配的区域 gbc.insets = new Insets(0,2,0,2); // 可选,设置组件间距 JTextField tickerField = new JTextField(); JTextField shareField = new JTextField(); gbc.gridx = 0; panel.add(tickerField, gbc); gbc.gridx = 1; panel.add(shareField, gbc); frame.add(panel, BorderLayout.NORTH); frame.setSize(250, 150); frame.setVisible(true); }
不推荐方案:强制设置BorderLayout下的组件大小
如果一定要保留BorderLayout,可以手动给两个输入框设置相同的首选宽度:
tickerField.setPreferredSize(new Dimension(100, 30)); shareField.setPreferredSize(new Dimension(100, 30));
但该方式不支持窗口自适应拉伸,窗口变宽后还是会出现宽度不均的问题,不建议使用。
内容的提问来源于stack exchange,提问作者mguddeti
相关产品推荐
相关产品推荐

