首页 文章

GridBagLayout无法正确布局

提问于
浏览
3

我是GridBagLayout的新手,但我尝试使用我能找到的标准约定,即在一张网格纸上绘制我的想法,然后尝试将网格值转换为gridbag ...

我的目标是制作如下所示的布局:

Desired layout

它目前看起来像这样:

Actual layout

任何想法为什么?

如果你想到一个左上角为0,0的网格,我正在寻找的确切尺寸

  • 目标图片中面板中的红色:从第0列开始,跨越10列,高度为1行

  • 为黑色面板:从第0列开始,第1行,跨10列,高度为20行

  • 为蓝色面板:从第0列开始,第21行,跨越10列,高度为1

  • 表示绿色列:从第10列开始,第0行,第16行,第7列,高度为7

  • 为紫色列:从第10列开始,第7行, Span 16列,高度为16

这是我的源代码:

GBC是一个扩展GridBagConstraints的辅助类,使用的构造函数是

GBC(int startingX,int startingY,int width,int height)

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Demo extends JApplet
{

    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();
    JPanel panel4 = new JPanel();
    JPanel panel5 = new JPanel();

    public void init()
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                initComponents();
            }
        });
    }

    public void initComponents()
    {
        //set the layout of the content pane to gridbag layout
        GridBagLayout gridBag = new GridBagLayout();
        getContentPane().setLayout(gridBag);

        Rectangle rect = getContentPane().getBounds();

        panel1.setBackground(Color.green);
        panel2.setBackground(Color.black);
        panel3.setBackground(Color.red);
        panel4.setBackground(Color.orange);
        panel5.setBackground(Color.yellow);

        add(panel4, new GBC(10, 0, 16, 7).setFill(GBC.BOTH).setWeight(1.0, 1.0));
        add(panel1, new GBC(0, 0, 10, 1).setFill(GBC.BOTH).setWeight(1.0, 1.0));
        add(panel3, new GBC(0, 21, 10, 1).setFill(GBC.BOTH).setWeight(1.0, 1.0));
        add(panel2, new GBC(0, 1, 10, 20).setFill(GBC.BOTH).setWeight(1.0, 1.0));
        add(panel5, new GBC(10, 7, 16, 16).setFill(GBC.BOTH).setWeight(1.0, 1.0));
    }
}

任何帮助将不胜感激(但请解释你的逻辑)

1 回答

  • 4

    那么你可以通过使用 GridBagLayout 轻松完成此任务 .

    考虑 contentPane 并将 GridBagLayout 作为其布局,您现在可以将 JPanel 分为三个部分 . 单个左侧 JPanel (带有GridBagLayout,其中包含 REDBLACKBLUE JPanel s),右侧包含两个 JPanel ,即 GREENMAGENTA .

    ------------------------
    |  left   | green JPanel |
    | JPanel  |______________|
    |  with   |magenta Jpanel|
    |3 JPanel |              |
    |________________________|
    

    现在左边 JPanelREDBLACKBLUE JPanel 放在其自身上, GridBagLayoutLayout ManagerRED and BLUEweighty = 0.1BLACKweighty = 0.8

    请参阅此示例代码:

    import java.awt.*;
    import javax.swing.*;
    
    public class GridBagExample {
        private JPanel leftPanel;
        private JPanel redPanel;
        private JPanel blackPanel;
        private JPanel bluePanel;
        private JPanel greenPanel;
        private JPanel magentaPanel;
    
        private GridBagConstraints gbc;
    
        public GridBagExample() {
            gbc = new GridBagConstraints();
            gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        }
    
        private void displayGUI() {
            JFrame frame = new JFrame("GridBagLayout Example");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
            JPanel contentPane = new JPanel(new GridBagLayout());
    
            leftPanel = getPanel(Color.WHITE);
            leftPanel.setLayout(new GridBagLayout());
            redPanel = getPanel(Color.RED.darker());
            blackPanel = getPanel(Color.BLACK);
            bluePanel = getPanel(Color.CYAN.darker().darker());
            greenPanel = getPanel(Color.GREEN.darker().darker());
            magentaPanel = getPanel(Color.MAGENTA);
            /**
              * @param : 
              * leftPanel : JPanel (with GridBagLayout), on which
              *               all other components will be placed.
              * redPanel : JPanel, which will be added to the leftPanel
              * 0 : specifies the grid X, which in this case is 0
              * 0 : specifies the grid Y, which in this case is 0
              * 1 : specifies the width for this grid (cell), we keeping 
              *     this default as 1
              * 1 : specifies the height for this grid (cell), we keeping
              *     this default as 1
              * GridBagConstraints.BOTH : allows JPanel to expand in both
              *     directions as the containing container expands (in 
              *     this case redPanel will expand both HORIZONTALLY and
              *     VERTICALLY, as leftPanel will expand)
              * weightx : This is the actual width the redPanel will occupy
              *           relative to all other components on the leftPanel
              * weighty : This is the actual height the redPanel will occupy
              *           relative to all other components on the leftPanel
              */
            addComp(leftPanel, redPanel, 0, 0, 1, 1,
                            GridBagConstraints.BOTH, 1.0, 0.1);
            addComp(leftPanel, blackPanel, 0, 1, 1, 1,
                            GridBagConstraints.BOTH, 1.0, 0.8);
            addComp(leftPanel, bluePanel, 0, 2, 1, 1,
                            GridBagConstraints.BOTH, 1.0, 0.1);
            addComp(contentPane, leftPanel, 0, 0, 1, 2,
                            GridBagConstraints.BOTH, 0.5, 1.0);
            addComp(contentPane, greenPanel, 1, 0, 1, 1,
                            GridBagConstraints.BOTH, 0.5, 0.3);
            addComp(contentPane, magentaPanel, 1, 1, 1, 1,
                            GridBagConstraints.BOTH, 0.5, 0.7);
    
            frame.setContentPane(contentPane);
            /*
             * Once you will add components to these
             * JPanels, then use pack(), instead of
             * setSize(). The use of the latter is 
             * just for illustration purpose only
             */
            //frame.pack();
            frame.setSize(300, 300);
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        private void addComp(JPanel panel, JComponent comp,
                                int x, int y, int width, int height,
                                int fill, double weightx, double weighty) {
            gbc.gridx = x;
            gbc.gridy = y;
            gbc.gridwidth = width;
            gbc.gridheight = height;
            gbc.fill = fill;
            gbc.weightx = weightx;
            gbc.weighty = weighty;
    
            panel.add(comp, gbc);
        }
    
        private JPanel getPanel(Color backColor) {
            JPanel panel = new JPanel();
            panel.setOpaque(true);
            panel.setBackground(backColor);
    
            return panel;
        }
    
        public static void main(String[] args) {
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    new GridBagExample().displayGUI();
                }
            };
            EventQueue.invokeLater(runnable);
        }
    }
    

    这是相同的输出:

    GRIDBAGLAYOUTIMAGE

相关问题