Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用GridBagLayout正确布局_Java_Swing_User Interface_Layout Manager_Gridbaglayout - Fatal编程技术网

Java 无法使用GridBagLayout正确布局

Java 无法使用GridBagLayout正确布局,java,swing,user-interface,layout-manager,gridbaglayout,Java,Swing,User Interface,Layout Manager,Gridbaglayout,我在开始构建的GUI中遇到了GridBagLayout和GridBagConstraints问题。我需要一些图片,其中一个是GUI的当前状态,另一个是所需的GUI状态。我一直在尝试达到所需的状态,但无法:(.这是代码,&我还将附加上面提到的两张图片。此外,我格式化第一个或第二个复选框的方式存在问题,但我无法找出问题所在 驾驶员等级: import javax.swing.SwingUtilities; public class Driver { public static void m

我在开始构建的GUI中遇到了GridBagLayout和GridBagConstraints问题。我需要一些图片,其中一个是GUI的当前状态,另一个是所需的GUI状态。我一直在尝试达到所需的状态,但无法:(.这是代码,&我还将附加上面提到的两张图片。此外,我格式化第一个或第二个复选框的方式存在问题,但我无法找出问题所在

驾驶员等级:

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();
            }
        });
    }
}
框架类

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);
    }
}
选择面板类

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

}
头盘类

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);
    }
}
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个复选框相同的水平空间,允许每个复选框显示在其自己的列中

然后,在添加其他组件之前,需要
将gridwidth重置为1

另一个选项可能是在面板上使用。然后您可以使用
FlowLayout
添加所有复选框。这是一个更简单的解决方案,因为您不需要担心所有的GridBagConstraint

编辑:

有关所有约束的信息,请阅读上的Swing教程部分

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

//this.getContentPane().add(selectionLab);
add(selectionLab, gbc);
它看起来仍然不正确,因为您需要了解与以下约束一起使用的正确值:

  • 沉重的
  • 锚定
  • 权重

  • 我将让您一次一个地处理约束,以查看更改约束时发生的情况。教程链接将帮助您处理不同的值。

    是否希望所有复选框在窗口中水平居中?您好,VGR,我遇到的问题是均匀合并“DEFCON 1”复选框和其他复选框。如果仔细观察,您可以发现“DEFCON 1”复选框相对于其他复选框有额外的左间距。这就是我面临的问题。感谢您的回复:)嗯,我尝试过这个,但似乎没有改变情况。我遇到的问题是在“DEFCON 1”和“DEFCON 2”JCheckbox之间创建了额外的空间。额外的间距位于“DEFCON 1”jcheckbox的右侧,如我共享的“当前图片”图像所示。谢谢你的回答,谢谢你的帮助:)谢谢!我相信我的问题也来自我根据我提供的JFRame布局在JFRame中设置JPanel的方式。我决定创建一个包含标题的独特JPanel。我将在问题中添加代码,并发布新结果的图像。