为了账号安全,请及时绑定邮箱和手机立即绑定

GridBagLayout - 我的列数似乎少于指定的列数,但为什么呢?

GridBagLayout - 我的列数似乎少于指定的列数,但为什么呢?

慕少森 2023-03-31 15:33:05
我想让我的框架设置看起来不难看,所以我决定深入研究布局。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 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

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

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

gbc.gridwidth = 3;

当您使用gridWidth约束时,您是在说您没有特定的列,因为它将占用 3 列的空间(假设您实际上有 3 列,但您没有)。由于您只有 2 个网格宽度为 1 的组件,因此您实际上只有 2 列。

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

为了演示这一点,请将您的代码更改为仅使用gridxgridy约束。

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

接下来,添加回:

gbc.gridwidth = 3;

对于“标签”。

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

接下来,添加回:

gbc.gridwidth = 1;

对于“开始”按钮。

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

我不确定你想要完成的确切布局,所以我不能给出建议的解决方案,但希望你能理解为什么你真的只有 2 列,而不是 3 列。

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

 JLabel filler = new JLabel("");
    gbc.gridheight = 1;
    gbc.gridwidth = 1;
    gbc.gridx = 0;
    gbc.gridy = 1;
    game_name.setPreferredSize(new Dimension(100, 30));
    startScreen.add(filler, gbc);


查看完整回答
反对 回复 2023-03-31
?
函数式编程

TA贡献1807条经验 获得超9个赞

GridBagLayouts 和 GridBagConstrains 就像 excel 表一样工作。有列和行,您可以在其中以水平和垂直方式放置组件。您还可以合并布局等。

据我了解你的情况,你有 3 个组件要放在 3 列中。

组件在布局中的位置由特定组件 GridBagConstraints 的gridxgridy值决定

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

对于colorbutton,gridx = 0 和 gridy = 0

对于游戏名称,gridx = 1 和 gridy = 0

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

所以所有 3 个组件将分布在同一行 (gridy) 和 3 个不同的列 (gridx)

gridwidth确定您是否要合并任何列。在您的例子中,您将 gridwidth 用作 game_name 标签的 3。因此,您要为此标签合并 3 列。

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

对于colorbutton,gridx = 0 和 gridy = 0

对于游戏名称,gridx = 1 和 gridy = 0

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

您可以通过使用我的第一个 x 和 y 值将网格宽度更改为 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);


查看完整回答
反对 回复 2023-03-31
  • 2 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信