无法使用 GridBagLayout 正确布局

Unable to layout properly with GridBagLayout

我在开始构建的 GUI 中遇到 GridBagLayout 和 GridBagConstraints 问题。我必须要图片,GUI 的当前状态之一,以及 GUI 的期望状态之一。我一直试图达到所需的状态,但一直无法 :(。这是代码,我还将附上上面提到的 2 张图片。此外,我格式化第一个或第二个复选框,但我一直无法弄清楚问题出在哪里。

Driver Class:

import javax.swing.SwingUtilities;

public class Driver {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TheFrame();
            }

        });
    }
}

JFrame Class:

import javax.swing.JFrame;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;

public class TheFrame extends JFrame {

    //Declarations
    private GridBagConstraints gbc;
    private String myString;
    private JLabel selectionLab;
    private JCheckBox defconLevel1;
    private JCheckBox defconLevel2;
    private JCheckBox defconLevel3;
    private JCheckBox defconLevel4;
    private JCheckBox defconLevel5;

    public TheFrame() {
        super("DEFCON DEACTIVATOR");
        this.setSize(500,500);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().setLayout(new GridBagLayout());

        //Initialization
        gbc = new GridBagConstraints();
        selectionLab = new JLabel("Please Select DECON Level");
        defconLevel1 = new JCheckBox("DEFCON 1");
        defconLevel2 = new JCheckBox("DEFCON 2");
        defconLevel3 = new JCheckBox("DEFCON 3");
        defconLevel4 = new JCheckBox("DEFCON 4");
        defconLevel5 = new JCheckBox("DEFCON 5");

        //Configuration


        //Add to contentPane
        //ROW 1
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = gbc.NORTH;
        gbc.weighty = 1;
        gbc.insets = new Insets(0,0,0,0);
        this.getContentPane().add(selectionLab);

        //ROW 2
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.anchor = gbc.NORTH;
        gbc.weighty= 1;
        gbc.insets = new Insets(0,0,0,0);
        this.getContentPane().add(defconLevel1,gbc);
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.anchor = gbc.NORTH;
        gbc.weighty= 1;
        gbc.insets = new Insets(0,0,0,0);
        this.getContentPane().add(defconLevel2,gbc);
        gbc.gridx = 2;
        gbc.gridy = 1;
        gbc.anchor = gbc.NORTH;
        gbc.weighty= 1;
        gbc.insets = new Insets(0,0,0,0);
        this.getContentPane().add(defconLevel3,gbc);
        gbc.gridx = 3;
        gbc.gridy = 1;
        gbc.anchor = gbc.NORTH;
        gbc.weighty= 1;
        gbc.insets = new Insets(0,0,0,0);
        this.getContentPane().add(defconLevel4,gbc);
        gbc.gridx = 4;
        gbc.gridy = 1;
        gbc.anchor = gbc.NORTH;
        gbc.weighty= 1;
        gbc.insets = new Insets(0,0,0,0);
        this.getContentPane().add(defconLevel5,gbc);
    }
}

更新代码:

Driver Class

import javax.swing.SwingUtilities;

public class Driver {

    //Declarations
    private static SelectionPanel selectionPanel;
    private static HeaderPanel headerPanel;
    private static TheFrame frame = new TheFrame(selectionPanel,headerPanel);


//  public Driver() {
//      
//  }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Driver();
            }
        });
    }
}

TheFrame Class

import javax.swing.JFrame;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;

public class TheFrame extends JFrame {

    //Declarations
    private GridBagConstraints gbc;
    private SelectionPanel selectionPanel;
    private HeaderPanel headerPanel;

    public TheFrame(SelectionPanel selectionPanel, HeaderPanel headerPanel) {
        super("DEFCON DEACTIVATOR");
        this.selectionPanel = selectionPanel;
        this.headerPanel = headerPanel;

        //Initialization
        gbc = new GridBagConstraints();
        selectionPanel = new SelectionPanel();
        headerPanel = new HeaderPanel();
        this.getContentPane().setLayout(new GridBagLayout());

        //Configuration


        //Add to contentPane
        gbc.anchor = gbc.NORTH; //Content-Pane GLOBAL
        gbc.insets = new Insets(0,0,0,0); //Content-Pane GLOBAL
        gbc.weightx = 0; //Content-Pane GLOBAL

        gbc.weighty = 0.05;
        gbc.gridx = 0;
        gbc.gridy = 0;
        this.getContentPane().add(headerPanel,gbc);
        gbc.weighty = 1;
        gbc.gridx = 0;
        gbc.gridy = 1;
        this.getContentPane().add(selectionPanel,gbc);

        //Finalize JFrame Last Steps Configurations
        this.setSize(500,500);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

选择面板Class

import java.awt.Insets;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

public class SelectionPanel extends JPanel {

    //Declarations
    private JCheckBox defconLevel1;
    private JCheckBox defconLevel2;
    private JCheckBox defconLevel3;
    private JCheckBox defconLevel4;
    private JCheckBox defconLevel5;
    private GridBagConstraints gbc;

    public SelectionPanel() {

        //Initializations
        defconLevel1 = new JCheckBox("DEFCON 1");
        defconLevel2 = new JCheckBox("DEFCON 2");
        defconLevel3 = new JCheckBox("DEFCON 3");
        defconLevel4 = new JCheckBox("DEFCON 4");
        defconLevel5 = new JCheckBox("DEFCON 5");
        gbc = new GridBagConstraints();

        //Configuration
        this.setLayout(new GridBagLayout());

        //Add
        //ROW 1
        gbc.insets = new Insets(0,0,0,0); //Content-Pane Global
        //gbc.anchor = gbc.EAST; //Makes Elements chain-follow each other
        gbc.gridy = 0;

        gbc.gridx = 0;
        this.add(defconLevel1,gbc);
        gbc.gridx = 1;
        this.add(defconLevel2,gbc);
        gbc.gridx = 2;
        this.add(defconLevel3,gbc);
        gbc.gridx = 3;
        this.add(defconLevel4,gbc);
        gbc.gridx = 4;
        this.add(defconLevel5,gbc);
    }
}

页眉面板Class

import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

public class HeaderPanel extends JPanel {
    private JLabel headerLab;
    private GridBagConstraints gbc;

    public HeaderPanel() {
        //Initialize
        headerLab = new JLabel("PLEASE SELECT DEFCON LEVEL");
        gbc = new GridBagConstraints();

        //Configure
        this.setLayout(new GridBagLayout());

        //Add
        gbc.gridx = 0;
        gbc.gridy = 0;
        this.add(headerLab,gbc);
    }

}

当前图片:

希望的设计:

更新图片:

标签的约束还需要:

    gbc.gridwitdh = 5;

这将允许标签占用与 5 个复选框相同的水平 space,允许每个复选框显示在其自己的列中。

然后您需要 reset the gridwidth to 1 添加其他组件。

另一种选择可能是在您的面板上使用 Titled Border。然后你可以只使用 FlowLayout 来添加所有的复选框。这是一个更简单的解决方案,因为您无需担心所有 GridBagConstraints。

编辑:

阅读有关 How to Use GridBagLayout 的 Swing 教程部分,了解有关所有约束的信息。

您需要做的第一件事就是实际使用标签的约束,否则设置网格宽度不会执行任何操作,因为将使用默认约束:

//this.getContentPane().add(selectionLab);
add(selectionLab, gbc);

它看起来仍然不正确,因为您随后需要了解要在以下限制条件下使用的正确值:

  1. 重量级
  2. 主播
  3. 权重x

我将让您一次使用一个约束,看看当您更改约束时会发生什么。教程 link 将有助于处理不同的值。