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

如何在1200宽度的JFrame中并排放置300和900宽的两个JPanel

嘿,这个需求在Swing里其实很好实现,我给你两种常用的方案,你可以根据自己的实际场景选择:

方法一:用BorderLayout实现(最简单直观)

BorderLayout是Swing默认的布局管理器之一,刚好能满足我们“固定左侧宽度、右侧填充剩余空间”的需求——它的WEST区域会优先使用组件的理想宽度,CENTER区域则自动占据容器剩下的空间。

以下是完整代码示例:

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

public class SideBySidePanels {
    public static void main(String[] args) {
        // 创建主窗口,设置宽度1200,高度自定义为600(你可以按需修改)
        JFrame frame = new JFrame("并排面板演示");
        frame.setSize(1200, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout()); // 启用BorderLayout

        // 左侧面板:固定宽度300,高度随窗口自适应
        JPanel leftPanel = new JPanel();
        leftPanel.setBackground(Color.LIGHT_GRAY); // 加背景色方便区分
        leftPanel.setPreferredSize(new Dimension(300, 0)); // 只指定宽度,高度由布局管理器处理

        // 右侧面板:自动填充剩余的900宽度(1200-300),高度自适应
        JPanel rightPanel = new JPanel();
        rightPanel.setBackground(Color.WHITE);

        // 将面板添加到窗口对应区域
        frame.add(leftPanel, BorderLayout.WEST);
        frame.add(rightPanel, BorderLayout.CENTER);

        frame.setVisible(true);
    }
}

这个方法的优点就是简单,不需要复杂配置,完全利用BorderLayout的原生特性就能实现需求。

方法二:用GridBagLayout实现(更灵活可控)

如果你之后需要对布局做更精细的调整(比如添加更多组件、调整拉伸比例),GridBagLayout会是更好的选择。我们可以通过设置组件的权重和理想大小来精确控制宽度。

代码示例如下:

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

public class GridBagPanelsExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("GridBagLayout并排面板");
        frame.setSize(1200, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH; // 让面板填充分配的空间
        gbc.weighty = 1.0; // 垂直方向拉伸权重,确保面板占满窗口高度

        // 左侧面板:固定宽度300,不参与水平拉伸
        JPanel leftPanel = new JPanel();
        leftPanel.setBackground(Color.LIGHT_GRAY);
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0; // 水平权重设为0,保持固定宽度
        gbc.preferredSize = new Dimension(300, 0);
        frame.add(leftPanel, gbc);

        // 右侧面板:占据剩余的900宽度,自动拉伸
        JPanel rightPanel = new JPanel();
        rightPanel.setBackground(Color.WHITE);
        gbc.gridx = 1;
        gbc.weightx = 1.0; // 水平权重设为1,占据所有剩余空间
        gbc.preferredSize = new Dimension(900, 0);
        frame.add(rightPanel, gbc);

        frame.setVisible(true);
    }
}

这里通过weightx属性控制拉伸优先级:左侧面板权重为0,不会被拉伸,保持300的宽度;右侧权重为1,会自动填满剩下的900宽度。

一些实用注意事项
  • 优先使用setPreferredSize()而非setSize()给面板指定大小:布局管理器通常会尊重组件的理想大小,而setSize()很可能会被布局管理器覆盖。
  • 如果需要内容区域严格为1200宽度(不含窗口边框),可以改用以下方式设置窗口:
    frame.getContentPane().setPreferredSize(new Dimension(1200, 600));
    frame.pack();
    
    这样窗口会自动调整边框尺寸,确保内容区域刚好是1200宽。
  • 给面板添加背景色是调试布局的小技巧:能快速帮你确认面板的位置和大小是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:58:25