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

Java Swing中setBounds未按预期生效问题求助

手动设置Swing组件位置尺寸失效的修复方案

问题根源

  1. JFrame尺寸计算陷阱:你设置的setSize(1380, 805)包含了系统标题栏和窗口边框的尺寸,实际内容面板(ContentPane)的可用空间比这个数值小。而你给combatPanel设了相同的1380x805,导致组件被截断、位置偏移。
  2. 组件渲染顺序错误:你先调用了this.setVisible(true),之后才把combatPanel添加到窗口,Swing无法正确渲染后添加的组件,自然显示不符合预期。

修复后的完整代码

import javax.swing.*;
import java.awt.*;

class MyFrame extends JFrame {
    MyFrame() {
        SwingUtilities.invokeLater(() -> {
            // 初始化所有子面板
            JPanel combatPanel = new JPanel();
            combatPanel.setLayout(null);
            combatPanel.setBounds(0,0,1380,805);
            combatPanel.setBackground(Color.darkGray);

            JPanel combatImage = new JPanel();
            combatImage.setLayout(null);
            combatImage.setBounds(0,0,1380,575);
            combatImage.setBackground(Color.black);

            JPanel combatActions  = new JPanel();
            combatActions.setLayout(null);
            combatActions.setBounds(0,575,480,230);
            combatActions.setBackground(Color.gray);

            JPanel combatActionInfo = new JPanel();
            combatActionInfo.setLayout(null);
            combatActionInfo.setBounds(480,575,900,115);
            combatActionInfo.setBackground(Color.lightGray);

            JPanel combatPlayerInfo = new JPanel();
            combatPlayerInfo.setLayout(null);
            combatPlayerInfo.setBounds(480,690,900,115);
            combatPlayerInfo.setBackground(Color.red);

            // 配置窗口基础参数
            this.setTitle("F&H 342");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setResizable(false);
            this.getContentPane().setBackground(Color.yellow);
            this.setIconImage(new ImageIcon("image.png").getImage());
            this.setLayout(null);

            // 计算窗口总尺寸:内容区域1380x805 + 标题栏边框的insets
            Insets insets = this.getInsets();
            this.setSize(1380 + insets.left + insets.right, 805 + insets.top + insets.bottom);

            // 组装组件层级
            combatPanel.add(combatImage);
            combatPanel.add(combatActions);
            combatPanel.add(combatActionInfo);
            combatPanel.add(combatPlayerInfo);
            this.add(combatPanel);

            // 最后再显示窗口
            this.setVisible(true);
        });
    }
}

public class Main {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame();
    }
}

可选优化

如果不需要系统默认的标题栏和边框,可以直接加一行this.setUndecorated(true),这样setSize(1380,805)就会直接对应内容区域的尺寸,无需计算insets,但要记得自己添加关闭窗口的按钮。

内容的提问来源于stack exchange,提问作者Danil Baril

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:00:17