Java Swing 创建JTextField网格时最后一个组件自定义尺寸失效问题
问题根因
该问题由Swing布局管理器的默认机制导致,核心问题有两个:
- JFrame默认使用
BorderLayout作为布局管理器,未显式关闭布局时直接调用add()方法添加组件,所有组件默认会被添加到BorderLayout.CENTER区域,同一区域仅能显示最后添加的组件,且该组件会自动填充整个区域,因此会出现最后一个文本框自动适配窗口大小的问题。 - 调用
setBounds()自定义组件位置尺寸的前提是关闭容器的自动布局,也就是将布局设置为空布局null,否则布局管理器会忽略你设置的bounds属性,按照布局规则自动计算组件位置大小。
解决方案
仅需在添加组件前给JFrame设置空布局即可解决,也可以根据需求选择更规范的网格布局实现:
- 空布局适配方案:新增代码
frame.setLayout(null);关闭自动布局,你自定义的setBounds规则就能生效。 - 最佳实践方案:如果需求就是固定网格排布文本框,更推荐使用
GridLayout布局管理器,不需要手动计算每个组件的位置,窗口缩放时适配性更好。
修改后的可运行代码
import javax.swing.*; public class SolverGUI { int sizeOfRect = 50; static int height = 5; static int width = 5; static JTextField[][] textFields = new JTextField[width][height]; static JFrame frame = new JFrame("Word Puzzle Solver"); public void createAndShowGUI() { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 800); // 新增:设置空布局,允许自定义组件位置尺寸 frame.setLayout(null); createWordPuzzleArea(); frame.setVisible(true); } public void createWordPuzzleArea() { for (int i = 0; i < height; i++) { for (int i2 = 0; i2 < width; i2++) { textFields[i2][i] = new JTextField(); // 可选:设置输入列数,避免默认文字占位撑开尺寸 textFields[i2][i].setColumns(1); frame.add(textFields[i2][i]); textFields[i2][i].setBounds(10 + (i2 * sizeOfRect), 10 + (i * sizeOfRect), sizeOfRect, sizeOfRect); } } } public static void main(String[] args) { // 符合Swing规范的GUI启动方式 SwingUtilities.invokeLater(() -> new SolverGUI().createAndShowGUI()); } }
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

