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

GridBagLayout下JScrollPane高度无法随父容器JFrame自适应调整问题

问题描述

我在GridBagLayout布局中放置了一个内含JTable的JScrollPane,当调整承载该布局的JFrame窗口大小时,表格仅会水平缩放而不会垂直缩放,哪怕我已经将GridBagConstraints.fill属性设置为GridBagConstraints.BOTH也无法解决问题。我希望JScrollPane可以根据父容器(即JFrame)的大小,同时实现水平和垂直方向的自适应缩放。

问题代码

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class GridBagPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    public GridBagPanel() {

        super(new GridBagLayout());

        String[] columns = { "Column 1", "Column 2", "Column 3", "Column 4" };
        String[][] contents = { { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" },
                { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" },
                { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" },
                { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" } };

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridwidth = GridBagConstraints.RELATIVE;
        gbc.fill = GridBagConstraints.BOTH;

        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.gridx = 0;
        gbc.gridy = 0;

        JTable table = new JTable(contents, columns);
        add(new JScrollPane(table), gbc);       
        
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.gridx = 0;
        gbc.gridy = 1;
        
        JButton button = new JButton("Button");
        JPanel panel = new JPanel();
        panel.add(button);
        add(panel, gbc);
    }

    public static void main(String[] args) {
        
        JFrame frame = new JFrame();
        GridBagPanel gbp = new GridBagPanel();
        frame.add(gbp);
        frame.pack();
        frame.setVisible(true);
        
    }
}

运行效果

运行结果

需求说明

需要将滚动面板视口的高度与父容器高度绑定,让整个JFrame窗口都能被组件填满,同时按钮需要紧贴滚动面板的边框,不要出现截图中的留白情况。

修复方案

将布局替换为BorderLayout即可实现需求,修复后代码如下:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import java.awt.BorderLayout;

public class LayoutTest {

    public static void main(String[] args) {
        
        String[] columns = { "Column 1", "Column 2", "Column 3", "Column 4" };
        String[][] contents = { { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" },
                { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" },
                { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" },
                { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" } };
        
        JFrame frame = new JFrame();
        JPanel wrapper = new JPanel();
        JPanel buttonPanel = new JPanel();      
        JButton button = new JButton("Button");
        JTable table = new JTable(contents, columns);
        JScrollPane scrollpane = new JScrollPane(table);
        wrapper.setLayout(new BorderLayout());
        
        buttonPanel.add(button);
        
        wrapper.add(scrollpane, BorderLayout.CENTER);
        wrapper.add(buttonPanel, BorderLayout.PAGE_END);
        
        frame.add(wrapper);
        frame.pack();
        frame.setVisible(true);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:48:04