java - 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);
解决方案
GridBagLayouts 和 GridBagConstrains 就像 Excel 表格一样工作。有列和行,您可以在其中以水平和垂直方式放置组件。您还可以合并布局等。
据我了解您的情况,您有 3 个组件要放在 3 列中。
组件在布局中的位置由特定组件 GridBagConstraints 的gridx和gridy值确定
因此,在您的情况下,您应该为每个组件设置以下值;
对于colorbutton, gridx = 0 和 gridy = 0
对于game_name, gridx = 1 和 gridy = 0
对于开始,gridx = 2 和 gridy = 0
所以所有 3 个组件将分布在同一行 (gridy) 和 3 个不同的列 (gridx)
gridwidth确定您是否要合并任何列。在您的情况下,您将 gridwidth 用作 3 作为 game_name 标签。因此,您正在合并此标签的 3 列。
因此,您的 gridx 值也应该更改以支持合并,如下所示;
对于colorbutton, 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);
希望这会有所帮助。
推荐阅读
- php - 配置“beta_settings”中无法识别或未经许可的密钥
- java - 如果其他类型的值双精度,如何
- salesforce-lightning - 在 Lightning Web 组件 (LWC) 中应用标准设计社区令牌
- javascript - 如何使用 react-native-router-flux 在每个场景中处理 backAndroidHandler
- sql - Create sequence in h2 database
- c++ - QCloseEvent 如何传播?
- r - R在终端闪亮
- javascript - 为什么 React Js 中的 indexOf() 函数返回 -1,即使参数是持续存在的
- laravel - Laravel 路由条件
- python - 硒刮