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

标签 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);

最佳答案

even though I have 3 components in 3 columns, for some reason, the first two components are put in the same column

实际上从 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 列。

请注意,作为一种技巧,您可以在第一列中添加一个虚拟组件,然后标签可以跨越 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);

关于java - GridBagLayout - 我的列数似乎比指定的少,但为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57079151/

相关文章:

java - 如何从用户输入的序列中查找唯一的数字(如果有)

java - dataModelUpdate 后自动排序 JTable

Java Swing - 从多线程更新 View

java - 在线 Java GUI 生成器?至少布局管理器

java - GridBagLayout 和面板的问题

Java 布局管理器建议

java - 如何在 WAR 文件中包含依赖项?

java finalize方法的使用

Java sleep() 在实际 sleep 命令之前停止执行代码

SwingUtilities.invokeLater()