You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing 创建JTextField网格时最后一个组件自定义尺寸失效问题

问题根因

该问题由Swing布局管理器的默认机制导致,核心问题有两个:

  • JFrame默认使用BorderLayout作为布局管理器,未显式关闭布局时直接调用add()方法添加组件,所有组件默认会被添加到BorderLayout.CENTER区域,同一区域仅能显示最后添加的组件,且该组件会自动填充整个区域,因此会出现最后一个文本框自动适配窗口大小的问题。
  • 调用setBounds()自定义组件位置尺寸的前提是关闭容器的自动布局,也就是将布局设置为空布局null,否则布局管理器会忽略你设置的bounds属性,按照布局规则自动计算组件位置大小。
解决方案

仅需在添加组件前给JFrame设置空布局即可解决,也可以根据需求选择更规范的网格布局实现:

  1. 空布局适配方案:新增代码frame.setLayout(null);关闭自动布局,你自定义的setBounds规则就能生效。
  2. 最佳实践方案:如果需求就是固定网格排布文本框,更推荐使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:39:05