我试图使框架设置看起来不难看,所以我决定深入研究布局。
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);
答案 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列。
那第一列没有唯一的宽度(因为添加到第一列的唯一组件跨越了多列),那么第二列应该从哪里开始?
为证明这一点,请将代码更改为仅使用gridWidth
和gridx
约束。
然后您将在3条单独的行的3列中看到3个组件。
接下来,添加回:
gridy
“标签”。
然后,您将在同一列中看到所有3个组件。这是因为网格宽度3也将用于“开始”按钮。因此,“标签”和“开始”组件实际上没有唯一的列,因此只有“颜色”具有已定义的列,因此您只有一个带有单个列的网格。
接下来,添加回:
gbc.gridwidth = 3;
“开始”按钮。
然后您将看到两列按钮,标签将跨越两列。这是因为“开始”和“颜色”具有唯一的列,而“标签”只能跨越2列(即使您要求它跨越3列)。
我不确定您要完成的确切布局,因此无法提供建议的解决方案,但希望您理解为什么您实际上只有2列而不是3列。
请注意,您可以在第一列中添加一个虚拟组件,然后标签可以跨越3列。虚拟组件将类似于:
gbc.gridwidth = 1;