Java gridbaglayout的组件可以在调整大小时填充父框架吗?

Java gridbaglayout的组件可以在调整大小时填充父框架吗?,java,swing,resize,layout-manager,gridbaglayout,Java,Swing,Resize,Layout Manager,Gridbaglayout,我有一个JFrame,它的根JPanel被一个GridBagLayout实例化。在运行时,面板根据一些描述填充组件,并且在描述中给出了宽度、高度和x、y坐标,用于GridBagConstraints中的gridwidth、gridx和gridy字段。组件本身也可以是JPanels以及它们自己的子组件和GridBagConstraints,GUI在树中描述,因此框架以递归方式填充 我遇到的问题是,当调整帧的大小时,内部组件不会拉伸以填充其给定的宽度和高度。我在下面给出了一个布局代码的示例,以及屏幕

我有一个
JFrame
,它的根
JPanel
被一个
GridBagLayout
实例化。在运行时,面板根据一些描述填充组件,并且在描述中给出了宽度、高度和x、y坐标,用于
GridBagConstraints
中的
gridwidth
gridx
gridy
字段。组件本身也可以是
JPanel
s以及它们自己的子组件和
GridBagConstraints
,GUI在树中描述,因此框架以递归方式填充

我遇到的问题是,当调整帧的大小时,内部组件不会拉伸以填充其给定的宽度和高度。我在下面给出了一个布局代码的示例,以及屏幕截图

import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.util.*;

public class GridBagTest extends JPanel {

    private final GridBagConstraints gbc = new GridBagConstraints();

    public GridBagTest(){

        setLayout(new GridBagLayout());
        add(gbcComponent(0,0,1,2), gbc);    
        add(gbcComponent(1,0,2,1), gbc);            
        add(gbcComponent(1,1,1,1), gbc);            
        add(gbcComponent(2,1,1,1), gbc);            

    }

    //Returns a JPanel with some component inside it, and sets the GBC fields
    private JPanel gbcComponent(int x, int y, int w, int h){

        gbc.gridx = x; 
        gbc.gridy = y;
        gbc.gridwidth = w;
        gbc.gridheight = h;
        gbc.fill = GridBagConstraints.BOTH;
        JPanel panel = new JPanel();
        JTextField text = new JTextField("(" + w + ", " + h + ")");
        panel.setBorder(new TitledBorder("(" + x + ", " + y + ")"));        
        panel.add(text);
        return panel;

    }

    public static void main (String args[]){

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new GridBagTest());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}


我需要它,因此在图2中,容纳组件的内部
JPanel
s被调整大小,以填充
GridBagLayout
上各自的宽度和高度,理想情况下也拉伸它们的组件

这通常是由于未设置权重x和权重约束

尝试:


这将允许GUI在需要时在x和y方向上展开。

您可以在调整JPanel的大小时设置
列宽
行高
。 看看这个样品。我修改了两列情况下的代码:

public GridBagTest(){

    setLayout(new GridBagLayout());
    add(gbcComponent(0,0,1,2), gbc);    
    add(gbcComponent(1,0,1,1), gbc);

    addComponentListener(new java.awt.event.ComponentAdapter() {
        @Override
        public void componentResized(java.awt.event.ComponentEvent evt) {
            GridBagLayout layout = (GridBagLayout) getLayout();
            JPanel panel = (JPanel)evt.getComponent();
            int width = panel.getWidth();
            int height = panel.getHeight();
            int wGap = panel.getInsets().left+panel.getInsets().right;
            int hGap = panel.getInsets().top+panel.getInsets().bottom;
            layout.columnWidths = new int[]{width/2-wGap, width/2-wGap};
            layout.rowHeights = new int[]{height-hGap};
        }
    });

}
根据列数和行数,可以对其进行更改。结果如下:

看起来这很有效!真不敢相信我以前从没试过。现在有没有办法让只有一个组件的内部面板在尺寸上拉伸以填充它?i、 e.文本字段的宽度被拉伸了?@adnan_252:是的,但是你需要给那些内部的JPanels布局管理器,比如GridBagLayout或BorderLayout,或者。。。目前,您的内部JPanel仅使用默认的FlowLayout,该布局非常简单,并且不会延伸组件。@adnan_252:不客气。感谢您在questino上发布了一个简单的示例程序。
public GridBagTest(){

    setLayout(new GridBagLayout());
    add(gbcComponent(0,0,1,2), gbc);    
    add(gbcComponent(1,0,1,1), gbc);

    addComponentListener(new java.awt.event.ComponentAdapter() {
        @Override
        public void componentResized(java.awt.event.ComponentEvent evt) {
            GridBagLayout layout = (GridBagLayout) getLayout();
            JPanel panel = (JPanel)evt.getComponent();
            int width = panel.getWidth();
            int height = panel.getHeight();
            int wGap = panel.getInsets().left+panel.getInsets().right;
            int hGap = panel.getInsets().top+panel.getInsets().bottom;
            layout.columnWidths = new int[]{width/2-wGap, width/2-wGap};
            layout.rowHeights = new int[]{height-hGap};
        }
    });

}