无法使用GridBagLayout正确布局

时间:2017-02-21 16:42:51

标签: java swing user-interface layout-manager gridbaglayout

我遇到GridBagLayout& amp; GUI中的GridBagConstraints我开始构建。我需要图片,GUI的当前状态之一,& GUI的所需状态之一。我一直试图达到理想的状态,但一直无法:(。这是代码,&我还将附上我上面提到的2张图片。而且,我在格式化第一个的方式存在问题或第二个复选框,但我一直无法弄清楚问题是什么。

驱动程序类:

import javax.swing.SwingUtilities;

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

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

        });
    }
}

JFrame类:

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);
    }
}

更新代码:

驱动程序类

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);
    }
}

SelectionPanel类

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);
    }
}

HeaderPanel类

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);
    }

}

现在图片:

enter image description here

希望设计:

enter image description here

更新图片:

enter image description here

1 个答案:

答案 0 :(得分:3)

标签的约束还需要:

    gbc.gridwitdh = 5;

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

在添加其他组件之前,您需要reset the gridwidth to 1

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

编辑:

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

您需要做的第一件事是实际使用标签的约束,否则设置gridwidth不会做任何事情,因为将使用默认约束:

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

它仍然看起来不正确,因为您需要了解与以下约束条件一起使用的正确值:

  1. 的weightx
  2. 我允许您一次玩一个约束来查看更改约束时会发生什么。教程链接将帮助您处理不同的值。