GridBagLayout-我的栏目似乎比指定的要少,但是为什么呢?

时间:2019-07-17 15:14:42

标签: java swing layout-manager gridbaglayout

我试图使框架设置看起来不难看,所以我决定深入研究布局。

GridBagLayout似乎用途最广,因此为了理解它,我在进行一些尝试。我的问题是,即使我在3列中有3个组件,由于某种原因,前两个组件也放在同一列中。也许我听不懂,但是我已经思考了20多次,这对我来说真的没有任何意义。请帮忙。

以下是一些代码:

// Frame Setup
        JFrame frame = new JFrame("GridBagLayout_Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(Color.CYAN);
        frame.setLocation(550, 250);
        frame.setSize(800, 550);

        JPanel startScreen = new JPanel(new GridBagLayout());
        startScreen.setBackground(Color.BLACK);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;

        JButton colorbutton = new JButton("Color");
        gbc.gridheight = 1;
        gbc.gridwidth = 1;
        gbc.gridx = 2;
        gbc.gridy = 0;
        colorbutton.setPreferredSize(new Dimension(100, 30));
        startScreen.add(colorbutton, gbc);

        JLabel game_name = new JLabel("LABEL");
        gbc.gridheight = 1;
        gbc.gridwidth = 3;
        gbc.gridx = 0;
        gbc.gridy = 1;
        game_name.setBackground(Color.ORANGE);
        game_name.setOpaque(true);
        game_name.setPreferredSize(new Dimension(100, 30));
        startScreen.add(game_name, gbc);

        JButton start = new JButton("START");
        gbc.gridheight = 1;
        gbc.gridwidth = 1;
        gbc.gridx = 1;
        gbc.gridy = 2;
        start.setPreferredSize(new Dimension(100, 30));
        startScreen.add(start, gbc);

        // Show Results
        frame.add(startScreen);
        frame.setVisible(true);

2 个答案:

答案 0 :(得分:0)

GridBagLayouts和GridBagConstrains的工作方式类似于Excel工作表。有几行和几行可以在其中水平和垂直放置组件。您还可以合并布局等等。

据我所知,您要在3列中放入3个组件。

组件在布局中的位置取决于特定组件GridBagConstraints的 gridx gridy

因此,在您的情况下,每个组件应具有以下值;

对于颜色按钮,gridx = 0和gridy = 0

对于 game_name ,gridx = 1和gridy = 0

对于开始,gridx = 2和gridy = 0

因此所有3个组件都将分布在同一行(网格)和3个不同的列(网格)

网格宽度确定是否要合并任何列。在您的情况下,您将game_name标签的gridwidth用作3。因此,您要为此标签合并3列。

因此,您的gridx值也应更改为支持合并,如下所示;

对于颜色按钮,gridx = 0和gridy = 0

对于 game_name ,gridx = 1和gridy = 0

对于开始,gridx = 4和gridy = 0

通过使用我的第一个x和y值将 gridwidth 更改为1,可以得到相同的输出

以下将是更正的代码;

// Frame Setup
        JFrame frame = new JFrame("GridBagLayout_Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(Color.CYAN);
        frame.setLocation(550, 250);
        frame.setSize(800, 550);

        JPanel startScreen = new JPanel(new GridBagLayout());
        startScreen.setBackground(Color.BLACK);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;

        JButton colorbutton = new JButton("Color");
        gbc.gridheight = 1;
        gbc.gridwidth = 1;
        gbc.gridx = 0; // change
        gbc.gridy = 0;
        colorbutton.setPreferredSize(new Dimension(100, 30));
        startScreen.add(colorbutton, gbc);

        JLabel game_name = new JLabel("LABEL");
        gbc.gridheight = 1;
        gbc.gridwidth = 3;
        gbc.gridx = 1; // change
        gbc.gridy = 0; // change
        game_name.setBackground(Color.ORANGE);
        game_name.setOpaque(true);
        game_name.setPreferredSize(new Dimension(100, 30));
        startScreen.add(game_name, gbc);

        JButton start = new JButton("START");
        gbc.gridheight = 1;
        gbc.gridwidth = 1;
        gbc.gridx = 4; // change
        gbc.gridy = 0; // change
        start.setPreferredSize(new Dimension(100, 30));
        startScreen.add(start, gbc);

        // Show Results
        frame.add(startScreen);
        frame.setVisible(true);

希望这会有所帮助。

答案 1 :(得分:0)

  

尽管我在3列中有3个组件,但由于某种原因,前两个组件放在同一列中

实际上,从GridBagLayout的角度来看,您只有两列。

.card-selected span:nth-child(-n+2){
    color: white !important;
}

当您使用gbc.gridwidth = 3; 约束时,是在说您没有特定的列,因为它会占据3列的空间(假设您实际上有3列没有)。由于只有2个组件的网格宽度为1,所以实际上只有2列。

那第一列没有唯一的宽度(因为添加到第一列的唯一组件跨越了多列),那么第二列应该从哪里开始?

为证明这一点,请将代码更改为仅使用gridWidthgridx约束。

然后您将在3条单独的行的3列中看到3个组件。

接下来,添加回:

gridy

“标签”。

然后,您将在同一列中看到所有3个组件。这是因为网格宽度3也将用于“开始”按钮。因此,“标签”和“开始”组件实际上没有唯一的列,因此只有“颜色”具有已定义的列,因此您只有一个带有单个列的网格。

接下来,添加回:

gbc.gridwidth = 3;

“开始”按钮。

然后您将看到两列按钮,标签将跨越两列。这是因为“开始”和“颜色”具有唯一的列,而“标签”只能跨越2列(即使您要求它跨越3列)。

我不确定您要完成的确切布局,因此无法提供建议的解决方案,但希望您理解为什么您实际上只有2列而不是3列。

请注意,您可以在第一列中添加一个虚拟组件,然后标签可以跨越3列。虚拟组件将类似于:

gbc.gridwidth = 1;