GridBagLayout - 我的列数似乎少于指定的列数,但为什么呢?
GridBagLayout - I seem to have less columns than I specified, but why?
我试图让我的框架设置看起来不难看,所以我决定深入研究布局。
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);
GridBagLayouts 和 GridBagConstrains 的工作方式类似于 excel sheet。有列和行,您可以在其中以水平和垂直方式放置组件。还可以合并布局等。
据我了解你的情况,你有 3 个组件要放在 3 列中。
组件在布局中的位置由特定组件 GridBagConstraints
的 gridx 和 gridy 值决定]
所以在你的情况下,你应该为每个组件设置以下值;
对于 colorbutton,gridx = 0 和 gridy = 0
对于 game_name,gridx = 1 和 gridy = 0
对于 start,gridx = 2 和 gridy = 0
因此所有 3 个组件将分布在同一行 (gridy) 和 3 个不同的列 (gridx)
gridwidth 确定您是否要合并任何列。在您的例子中,您将 gridwidth 用作 game_name 标签的 3。因此,您要为此标签合并 3 列。
因此,您的 gridx 值也应该更改以支持合并,如下所示;
对于 colorbutton,gridx = 0 和 gridy = 0
对于 game_name,gridx = 1 和 gridy = 0
对于 start,gridx = 4 和 gridy = 0
您可以通过将 gridwidth 更改为 1 以及我的第一个 x 和 y 值
来获得相同的输出
以下是修改后的代码;
// 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);
希望这会有所帮助。
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 列的 space(假设您实际上有 3 列,但您没有吨)。因为你只有 2 个网格宽度为 1 的组件,所以你实际上只有 2 列。
也就是说第一列没有唯一的宽度(因为添加到第一列的唯一组件跨越多列),那么第二列应该从哪里开始?
为了演示这一点,请将您的代码更改为仅使用 gridx
和 gridy
约束。
然后您将在 3 行的 3 列中看到 3 个组件。
接下来,添加回:
gbc.gridwidth = 3;
为 "label".
然后您将在一列中看到所有 3 个组件。这是因为 3 的网格宽度也将用于 "start" 按钮。所以实际上 "label" 和 "start" 组件没有唯一的列,所以只有 "color" 有一个定义的列,所以你有一个只有一个列的网格。
接下来,加回:
gbc.gridwidth = 1;
用于 "start" 按钮。
然后您将看到两列按钮,标签将跨越两列。这是因为 "start" 和 "color" 具有唯一的列,而 "label" 只能跨越 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);
我试图让我的框架设置看起来不难看,所以我决定深入研究布局。
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);
GridBagLayouts 和 GridBagConstrains 的工作方式类似于 excel sheet。有列和行,您可以在其中以水平和垂直方式放置组件。还可以合并布局等。
据我了解你的情况,你有 3 个组件要放在 3 列中。
组件在布局中的位置由特定组件 GridBagConstraints
的 gridx 和 gridy 值决定]所以在你的情况下,你应该为每个组件设置以下值;
对于 colorbutton,gridx = 0 和 gridy = 0
对于 game_name,gridx = 1 和 gridy = 0
对于 start,gridx = 2 和 gridy = 0
因此所有 3 个组件将分布在同一行 (gridy) 和 3 个不同的列 (gridx)
gridwidth 确定您是否要合并任何列。在您的例子中,您将 gridwidth 用作 game_name 标签的 3。因此,您要为此标签合并 3 列。
因此,您的 gridx 值也应该更改以支持合并,如下所示;
对于 colorbutton,gridx = 0 和 gridy = 0
对于 game_name,gridx = 1 和 gridy = 0
对于 start,gridx = 4 和 gridy = 0
您可以通过将 gridwidth 更改为 1 以及我的第一个 x 和 y 值
来获得相同的输出以下是修改后的代码;
// 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);
希望这会有所帮助。
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 列的 space(假设您实际上有 3 列,但您没有吨)。因为你只有 2 个网格宽度为 1 的组件,所以你实际上只有 2 列。
也就是说第一列没有唯一的宽度(因为添加到第一列的唯一组件跨越多列),那么第二列应该从哪里开始?
为了演示这一点,请将您的代码更改为仅使用 gridx
和 gridy
约束。
然后您将在 3 行的 3 列中看到 3 个组件。
接下来,添加回:
gbc.gridwidth = 3;
为 "label".
然后您将在一列中看到所有 3 个组件。这是因为 3 的网格宽度也将用于 "start" 按钮。所以实际上 "label" 和 "start" 组件没有唯一的列,所以只有 "color" 有一个定义的列,所以你有一个只有一个列的网格。
接下来,加回:
gbc.gridwidth = 1;
用于 "start" 按钮。
然后您将看到两列按钮,标签将跨越两列。这是因为 "start" 和 "color" 具有唯一的列,而 "label" 只能跨越 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);