Java GridBagLayout-如何使此单元格填充其下方的空间?

Java GridBagLayout-如何使此单元格填充其下方的空间?,java,swing,layout-manager,gridbaglayout,Java,Swing,Layout Manager,Gridbaglayout,我正在用4个JPanel创建一个JFrame。使用GridBagLayout,我创建了三行两列,每列两个面板。通过将蓝色面板的单元格高度从1更改为2,我可以使其覆盖其下方的单元格。我想做同样的绿色面板,以填补它下面的空间。以下是我的代码当前生成的内容: 我尝试将绿色面板的gridheight更改为2,但结果是: 我是否错误地使用了GridBagLayout?这样做的适当方式是什么 这是我的密码: import java.awt.Color; import java.awt.Container

我正在用4个JPanel创建一个JFrame。使用GridBagLayout,我创建了三行两列,每列两个面板。通过将蓝色面板的单元格高度从1更改为2,我可以使其覆盖其下方的单元格。我想做同样的绿色面板,以填补它下面的空间。以下是我的代码当前生成的内容:

我尝试将绿色面板的gridheight更改为2,但结果是:

我是否错误地使用了GridBagLayout?这样做的适当方式是什么

这是我的密码:

import java.awt.Color;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        addComponents(frame.getContentPane());
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void addComponents(Container contentPane) {
        contentPane.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(3,3,3,3);
        c.fill = GridBagConstraints.BOTH;

        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 2;
        c.weightx = 1;
        c.weighty = 0.85;
        JPanel panel1 = new JPanel();
        panel1.setBackground(Color.BLUE);
        contentPane.add(panel1, c);

        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 1;
        c.gridheight = 1;
        c.weightx = 1.1;
        c.weighty = 0.35;
        JPanel panel2 = new JPanel();
        panel2.setBackground(Color.YELLOW);
        contentPane.add(panel2, c);

        c.gridx = 1;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        c.weightx = 0.15;
        c.weighty = 0.5;
        JPanel panel3 = new JPanel();
        panel3.setBackground(Color.RED);
        contentPane.add(panel3, c);

        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        c.weightx = 0.38;
        c.weighty = 0.5;
        JPanel panel4 = new JPanel();
        panel4.setBackground(Color.GREEN);
        contentPane.add(panel4, c);
    }
}
我创建了三行两列

实际上,您只有两行,因为您只添加网格值为0和1的组件。其中一个组件的gridheight为2不会创建新行

一种解决方案是使用嵌套面板

为蓝色和黄色组件创建面板。这将使用一列两行的GridBagLayout。然后为每个组件设置权重值,以获得所需的高度

然后,再次为红色和绿色组件创建第二个面板,其中包含一列和两行。重量将分别设置为0.5

最后,创建第三个面板,其中包含两列和一行。设置所需的权重X并将上述两个面板添加到此面板,然后将面板添加到框架

我创建了三行两列

实际上,您只有两行,因为您只添加网格值为0和1的组件。其中一个组件的gridheight为2不会创建新行

一种解决方案是使用嵌套面板

为蓝色和黄色组件创建面板。这将使用一列两行的GridBagLayout。然后为每个组件设置权重值,以获得所需的高度

然后,再次为红色和绿色组件创建第二个面板,其中包含一列和两行。重量将分别设置为0.5


最后,创建第三个面板,其中包含两列和一行。设置所需的权重X,并将上述两个面板添加到此面板,然后将面板添加到框架。

如果第三列有三个单元格,每个单元格的行跨度为1,则布局开始按预期运行

import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
公共类另一个面板布局{
私有JComponent ui=null;
另一个面板布局(){
initUI();
}
public void initUI(){
如果(ui!=null){
返回;
}
ui=新的JPanel(新的BorderLayout(4,4));
ui.setboorder(新的空订单(4,4,4,4));
添加组件(ui);
}
公共void addComponents(容器内容窗格){
setLayout(新的GridBagLayout());
GridBagConstraints c=新的GridBagConstraints();
c、 插图=新插图(3,3,3,3);
c、 fill=GridBagConstraints.BOTH;
c、 gridx=0;
c、 gridy=0;
c、 网格宽度=1;
c、 网格高度=2;
c、 权重x=0.66;
c、 权重y=0.66;
JPanel panel1=新的JPanel();
添加标签(面板1,c);
镶板1.立根背景(颜色:青色);
contentPane.add(panel1,c);
c、 gridx=0;
c、 gridy=2;
c、 网格宽度=1;
c、 网格高度=1;
//c、 weightx=1.1;//逻辑?
c、 权重x=0.66;
c、 权重y=0.33;
JPanel panel2=新的JPanel();
添加标签(面板2,c);
镶板2.立根背景(颜色:黄色);
contentPane.add(panel2,c);
c、 gridx=1;
c、 gridy=0;
c、 网格宽度=1;
c、 网格高度=1;
c、 权重x=0.33;
c、 权重y=0.33;
JPanel panel3=新的JPanel();
添加标签(面板3,c);
镶板3.立根背景(颜色:红色);
contentPane.add(panel3,c);
c、 gridx=1;
c、 gridy=1;
c、 网格宽度=1;
c、 网格高度=2;
c、 权重x=0.33;
c、 权重y=0.66;
JPanel panel4=新的JPanel();
添加标签(面板4,c);
嵌板4.立根背景(颜色:绿色);
contentPane.add(panel4,c);
//黑客修复?
c、 gridx=2;
c、 gridy=0;
c、 网格宽度=1;
c、 网格高度=1;
c、 权重x=0.01;
c、 权重y=0.33;
JPanel panelH1=新的JPanel();
//添加标签(面板H1,c);
镶板1.背景(颜色为洋红色);
contentPane.add(panelH1,c);
c、 gridy=1;
JPanel panelH2=新的JPanel();
//addLabel(面板H2,c);
镶板H2.背景(颜色为洋红色);
contentPane.add(panelH2,c);
c、 gridy=2;
JPanel panelH3=新的JPanel();
//添加标签(面板H3,c);
镶板H3.背景(颜色为洋红色);
contentPane.add(panelH3,c);
}
专用void addLabel(JPanel面板、GridBagc){
添加(新的JLabel(约束字符串(gbc));
}
私有字符串constraintsToString(GridBagConstraints gbc){
StringBuilder sb=新的StringBuilder();
某人加上(“”);
sb.append(addrowtable(“Grid X”,gbc.gridx));
sb.append(addrowtable(“Grid Y”,gbc.Grid));
sb.追加(addrowtable(“权重X”,gbc.权重X));
sb.追加(addrowtable(“权重Y”,gbc.权重));
sb.append(addrowtable(“网格宽度”,gbc.gridwidth));
sb.append(addrowtable(“网格高度”,gbc.gridheight));
使某人返回字符串();
}
私有字符串AddRowtTable(字符串标签,双值){
StringBuilder sb=新的StringBuilder(“”);
某人附加(标签);
某人加上(“”);
附加(价值);
某人加上(“”);
使某人返回字符串();
}
公共JComponent getUI(){
返回用户界面;
}
公共静态void main(字符串[]args){
Runnable r=新的Runnable(){
@凌驾
公开募捐{
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class AnotherFourPanelLayout {

    private JComponent ui = null;

    AnotherFourPanelLayout() {
        initUI();
    }

    public void initUI() {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        addComponents(ui);
    }

    public void addComponents(Container contentPane) {
        contentPane.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(3, 3, 3, 3);
        c.fill = GridBagConstraints.BOTH;

        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 2;
        c.weightx = 0.66;
        c.weighty = 0.66;
        JPanel panel1 = new JPanel();
        addLabel(panel1, c);
        panel1.setBackground(Color.CYAN);
        contentPane.add(panel1, c);

        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 1;
        c.gridheight = 1;
        //c.weightx = 1.1; // logical?
        c.weightx = 0.66; 
        c.weighty = 0.33;
        JPanel panel2 = new JPanel();
        addLabel(panel2, c);
        panel2.setBackground(Color.YELLOW);
        contentPane.add(panel2, c);

        c.gridx = 1;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        c.weightx = 0.33;
        c.weighty = 0.33;
        JPanel panel3 = new JPanel();
        addLabel(panel3, c);
        panel3.setBackground(Color.RED);
        contentPane.add(panel3, c);

        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 2;
        c.weightx = 0.33;
        c.weighty = 0.66;
        JPanel panel4 = new JPanel();
        addLabel(panel4, c);
        panel4.setBackground(Color.GREEN);
        contentPane.add(panel4, c);

        // hack to fix?
        c.gridx = 2;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        c.weightx = 0.01;
        c.weighty = 0.33;
        JPanel panelH1 = new JPanel();
        //addLabel(panelH1, c);
        panelH1.setBackground(Color.MAGENTA);
        contentPane.add(panelH1, c);

        c.gridy = 1;
        JPanel panelH2 = new JPanel();
        //addLabel(panelH2, c);
        panelH2.setBackground(Color.MAGENTA);
        contentPane.add(panelH2, c);

        c.gridy = 2;
        JPanel panelH3 = new JPanel();
        //addLabel(panelH3, c);
        panelH3.setBackground(Color.MAGENTA);
        contentPane.add(panelH3, c);
    }

    private void addLabel(JPanel panel, GridBagConstraints gbc) {
        panel.add(new JLabel(constraintsToString(gbc)));
    }

    private String constraintsToString(GridBagConstraints gbc) {
        StringBuilder sb = new StringBuilder();

        sb.append("<html><table>");
        sb.append(addRowToTable("Grid X", gbc.gridx));
        sb.append(addRowToTable("Grid Y", gbc.gridy));
        sb.append(addRowToTable("Weight X", gbc.weightx));
        sb.append(addRowToTable("Weight Y", gbc.weighty));
        sb.append(addRowToTable("Grid Width", gbc.gridwidth));
        sb.append(addRowToTable("Grid Height", gbc.gridheight));

        return sb.toString();
    }

    private String addRowToTable(String label, double value) {
        StringBuilder sb = new StringBuilder("<tr><td>");

        sb.append(label);
        sb.append("</td><td>");
        sb.append(value);
        sb.append("</td></tr>");


        return sb.toString();
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                AnotherFourPanelLayout o = new AnotherFourPanelLayout();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}