简体   繁体   English

GridBagLayout无法正确布局

[英]GridBagLayout cant get layout right

I'm new to GridBagLayout but I tried to use the standard convention that I could find which was to draw out my idea on a piece of grid paper and then try and translate the grid values into gridbag... 我是GridBagLayout的新手,但我尝试使用我能找到的标准约定,即在一张网格纸上绘制我的想法,然后尝试将网格值转换为gridbag ...

my goal is to make the layout like you see below: 我的目标是制作如下所示的布局:

期望的布局

it currently looks like this: 它目前看起来像这样:

实际布局

any idea's as to why? 任何想法为什么?

the exact dimensions i'm looking for if you think of a grid with the upper left hand corner being 0,0 for 如果你想到一个左上角为0,0的网格,我正在寻找的确切尺寸

  1. the red in panel in the goal picture: start at column 0, span 10 columns, with height 1 row 目标图片中面板中的红色:从第0列开始,跨越10列,高度为1行
  2. for the black panel: start at column 0, row 1, span 10 columns, with height 20 rows 对于黑色面板:从第0列开始,第1行,跨10列,高度为20行
  3. for the blue panel: start at column 0, row 21, span 10 columns, with height 1 对于蓝色面板:从第0列开始,第21行,跨越10列,高度为1
  4. for the green column: start at column 10, row 0, span 16 columns, with height 7 对于绿色列:从第10列开始,第0行,跨度16列,高度为7
  5. for the purple column: start at column 10, row 7, span 16 columns, with height 16 对于紫色列:从第10列开始,第7行,跨度16列,高度为16

here is my source code: 这是我的源代码:

GBC is a helper class that extends GridBagConstraints, the constructor used is GBC是一个扩展GridBagConstraints的辅助类,使用的构造函数是

GBC(int startingX,int startingY,int width,int height) 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));
    }
}

any help would be appreciated (but please explain your logic) 任何帮助将不胜感激(但请解释你的逻辑)

Well you can easily accomplish this by using a GridBagLayout . 那么你可以通过使用GridBagLayout轻松实现这一点。

Considering contentPane with GridBagLayout as its layout, you can divide the JPanel into three parts now. 考虑使用GridBagLayout作为布局的contentPane ,您现在可以将JPanel分为三个部分。 A single left side JPanel (with GridBagLayout, and which will contain those RED , BLACK and BLUE JPanel s), and the right side consisting of two JPanel s, ie GREEN and MAGENTA . 一个左侧JPanel (带有GridBagLayout,它将包含那些REDBLACKBLUE JPanel ),右侧包含两个JPanel ,即GREENMAGENTA

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

Now the left JPanel will place RED , BLACK and BLUE JPanel on itself, with GridBagLayout as its Layout Manager with RED and BLUE having weighty = 0.1 , and BLACK having weighty = 0.8 现在左边的JPanel将自己放置REDBLACKBLUE JPanelGridBagLayout作为Layout ManagerRED and BLUE weighty = 0.1 ,而BLACK weighty = 0.8

See this example code : 请参阅此示例代码:

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

Here is the output of the same : 这是相同的输出:

GRIDBAGLAYOUTIMAGE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM