3

所以我有 6 个面板,它们都使用了网格布局。我用gridbaglayout把它们放在一起,这是我想要的设计

布局

原来它变得一团糟“第二个”面板变得离右边更远了第三个面板被挤到了左边,这是一场灾难。这是我的网格包布局代码

    c.gridx = 0; c.gridy = 0;
    add (first,c); 

    c.gridx = 2; //so that the second panel starts from the center and is divided evenly with the first panel
    add(second,c);

    c.gridx = 0; c.gridy = 1;
    add(third,c);

    c.gridx = 1; 
    add(fourth,c);

    c.gridx = 2;
    add(fifth,c);

    c.gridx = 3;
    add(sixth,c);

任何帮助表示赞赏。

4

4 回答 4

6

正如您所写,您忘记指定要占用c.gridx = 0 and c.gridy = 0多少列。JPanel为了指定这一点,您应该使用c.gridwidth = 2,它告诉布局这JPanel需要两列的空间。

要获得这样的输出:

GRIDBAGLAYOUT示例

这是一个小的工作示例:

import java.awt.*;
import javax.swing.*;
// http://stackoverflow.com/questions/10968853/two-jpanels-in-jframe-one-under-other
public class GridBagLayoutExample
{
    // http://stackoverflow.com/questions/10977017/grid-bag-layout-not-displaying-the-way-i-want
    private void displayGUI()
    {
        JFrame frame = new JFrame("GridBagLayout Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        gbc.weightx = 0.5;
        gbc.weighty = 0.2;

        JPanel topLeftPanel = new JPanel();
        topLeftPanel.setOpaque(true);
        topLeftPanel.setBackground(Color.DARK_GRAY);
        contentPane.add(topLeftPanel, gbc);

        gbc.gridx = 2;

        JPanel topRightPanel = new JPanel();
        topRightPanel.setOpaque(true);  
        topRightPanel.setBackground(Color.BLUE);
        contentPane.add(topRightPanel, gbc);

        gbc.gridwidth = 1;
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.weightx = 0.25;
        gbc.weighty = 0.8;

        JPanel firstPanel = new JPanel();
        firstPanel.setOpaque(true);
        firstPanel.setBackground(Color.RED);
        contentPane.add(firstPanel, gbc);

        gbc.gridx = 1;

        JPanel secondPanel = new JPanel();
        secondPanel.setOpaque(true);
        secondPanel.setBackground(Color.GREEN.darker());
        contentPane.add(secondPanel, gbc);

        gbc.gridx = 2;

        JPanel thirdPanel = new JPanel();
        thirdPanel.setOpaque(true);
        thirdPanel.setBackground(Color.WHITE);
        contentPane.add(thirdPanel, gbc);

        gbc.gridx = 3;

        JPanel fourthPanel = new JPanel();
        fourthPanel.setOpaque(true);
        fourthPanel.setBackground(Color.MAGENTA);
        contentPane.add(fourthPanel, gbc);

        frame.setContentPane(contentPane);
        frame.setSize(200, 300);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new GridBagLayoutExample().displayGUI();
            }           
        });
    }
}
于 2012-06-11T11:58:37.570 回答
4

这是(另一种)替代嵌套布局。面板 3 到 6 将获得额外的高度,额外的宽度将平均分配给所有 6 个面板。

六面板嵌套

import java.awt.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

public class SixPanelNested {

    SixPanelNested() {
        JPanel gui = new JPanel(new BorderLayout());
        gui.setBorder(new TitledBorder("BorderLayout()"));

        JPanel north = new JPanel(new GridLayout(1,0));
        north.setBorder(new TitledBorder("GridLayout(1,0)"));
        gui.add(north, BorderLayout.NORTH);
        for (int ii=1; ii<3; ii++) {
            JLabel l = new JLabel("Panel " + ii);
            l.setBorder(new LineBorder(Color.BLACK));
            north.add(l);
        }

        JPanel south = new JPanel(new GridLayout(1,0));
        south.setBorder(new TitledBorder("GridLayout(1,0)"));
        gui.add(south);
        for (int ii=3; ii<7; ii++) {
            JLabel l = new JLabel("Panel " + ii);
            l.setBorder(new LineBorder(Color.BLACK));
            south.add(l);
        }

        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SixPanelNested();
            }
        });
    }
}
于 2012-06-11T09:26:23.000 回答
3

I am not familiar enough with the GridBagLayout to quickly spot what you can improve to your code to fix this. But another approach might be possible, using nested BorderLayouts.

Panels 'first', 'third' and 'fourth' can be placed inside one JPanel Awith a BorderLayout in the NORTH, WEST and EAST respectively. The same can be done for the panels 'second', 'fifth' and 'sixth' in a JPanel B.

Then you group those 2 panels (A and B) in another panel with a BorderLayout in the WEST and EAST

于 2012-06-11T09:03:11.393 回答
2

添加这个:

c.gridwidth = 2;

在添加 FIRST 和 SECOND 面板之前,在添加其他面板之前将 gridwidth 设置回 1。或者,您可以按照上面的建议将它们进一步分开。您可以为每一行使用两个 FlowLayout,并将这两个添加到另一个具有 NORTH/SOUTH 的 BorderLayout 的面板。

于 2012-06-11T09:14:02.753 回答