GridBagLayout无法正确布局

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

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

期望的布局

它目前看起来像这样:

实际布局

任何想法为什么?

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

  1. 目标图片中面板中的红色:从第0列开始,跨越10列,高度为1行
  2. 对于黑色面板:从第0列开始,第1行,跨越10列,高度为20行
  3. 对于蓝色面板:从第0列开始,第21行,跨越10列,高度为1
  4. 对于绿色列:从第10列开始,第0行,跨度16列,高度为7
  5. 对于紫色列:从第10列开始,第7行,跨度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)); } } 

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

那么你可以通过使用GridBagLayout轻松实现这一目标。

考虑使用GridBagLayout作为布局的contentPane ,您现在可以将JPanel分为三个部分。 一个左侧JPanel (带有GridBagLayout,它将包含那些REDBLACKBLUE JPanel ),右侧包含两个JPanel ,即GREENMAGENTA

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

现在左边的JPanel将自己放置REDBLACKBLUE JPanelGridBagLayout作为Layout ManagerRED and BLUE weighty = 0.1BLACK weighty = 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