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


慕少森
浏览 118回答 2
2回答

qq_遁去的一_1

尽管我在 3 列中有 3 个组件,但出于某种原因,前两个组件放在同一列中实际上,从 GridBagLayout 的角度来看,您只有两列。gbc.gridwidth = 3;当您使用gridWidth约束时,您是在说您没有特定的列,因为它将占用 3 列的空间(假设您实际上有 3 列,但您没有)。由于您只有 2 个网格宽度为 1 的组件,因此您实际上只有 2 列。那就是第一列没有唯一的宽度(因为添加到第一列的唯一组件跨越多列),那么第二列应该从哪里开始呢?为了演示这一点,请将您的代码更改为仅使用gridx和gridy约束。然后您将在 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);

函数式编程

GridBagLayouts 和 GridBagConstrains 就像 excel 表一样工作。有列和行,您可以在其中以水平和垂直方式放置组件。您还可以合并布局等。据我了解你的情况,你有 3 个组件要放在 3 列中。组件在布局中的位置由特定组件 GridBagConstraints 的gridx和gridy值决定因此,在您的情况下,每个组件都应该具有以下值;对于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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java