GridBagLayout面板对齐

Dar*_*Jee 7 java swing jpanel gridbaglayout

我对GridBag布局管理器有一点问题.我试图显示9个这样的面板:

理想的布局 - 图解

为此,我将网格分开:

正在进行的工作 - 图解

对于面板1到7没有问题,它们就像我想要的那样出现.但问题始于小组S8S9.正如你所看到的那样S8,S9占据了一半的框架,但是我无法让它显示出来.该S8在的始端S4,以及S9在年底开始S4,我不能处理的一半的空间.

我想出的唯一方法就是将面板S8S9面板放在另一个采用所有框架宽度的面板上 - 但是必须有一个正确的方法来显示这两个面板而不将它们放在另一个面板中!

这是代码:

workzone.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.NORTHWEST;
c.fill = GridBagConstraints.BOTH;
c.weightx = 0.5;
c.weighty = 0.5;
c.insets = new Insets(0,0,0,0);

//S1
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 2;
c.gridheight = 2;
workzone.add(S1, c);

//S2
c.gridx = 2;
c.gridy = 0;
c.gridwidth = 2;
c.gridheight = 1;
workzone.add(S2, c);

//S3
c.gridx = 2;
c.gridy = 1;
c.gridwidth = 2;
c.gridheight = 1;
workzone.add(S3, c);

//S4
c.gridx = 4;
c.gridy = 0;
c.gridwidth = 2;
c.gridheight = 2;
workzone.add(S4, c);

//S5
c.gridx = 7;
c.gridy = 0;
c.gridwidth = 1;
c.gridheight = 1;
workzone.add(S5, c);

//S6
c.gridx = 7;
c.gridy = 1;
c.gridwidth = 2;
c.gridheight = 1;
workzone.add(S6, c);

//S7
c.gridx = 8;
c.gridy = 0;
c.gridwidth = 2;
c.gridheight = 2;
workzone.add(S7, c);

//S8
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 5;
c.gridheigth = 1;
workzone.add(S8, c);

//S9
c.gridx = 6;
c.gridy = 2;
c.gridwidth = 5;
c.gridheight = 1;
workzone.add(S9, c);
Run Code Online (Sandbox Code Playgroud)

欢迎任何想法和主张!

spl*_*bob 9

好问题.我很少破解它,但我得到了它.通常情况下,我会将1-7位置放在顶部面板中,将8-9放在底部面板中,但我喜欢使用GBL的1个面板的挑战.[无聊]

问题是第4节(列索引4和5)没有为GBL定义好,所以第8节不知道要用多远来覆盖它的第五列(索引4),所以它只是在列索引后停止3.

所以,我在构成第4部分的列中添加了2个零高度的垫片,它起作用了.注释掉标记为SPACERS的2行,看看我的意思:

编辑:@SheridanVespo建议添加修复

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class GridBagDemo2 implements Runnable
{
  private Color[] colors = {Color.BLACK, Color.BLUE, Color.CYAN, Color.GRAY,
                            Color.GREEN, Color.MAGENTA, Color.ORANGE,
                            Color.PINK, Color.RED, Color.YELLOW};

  private JPanel panel;
  private GridBagConstraints gbc;

  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new GridBagDemo2());
  }

  public void run()
  {
    panel = new JPanel(new GridBagLayout());
    gbc = new GridBagConstraints();

    add(0,0, 2,2, "1");
    add(2,0, 2,1, "2");
    add(2,1, 2,1, "3");
    add(4,0, 2,2, "4");
    add(6,0, 2,1, "5");
    add(6,1, 2,1, "6");
    add(8,0, 2,2, "7");
    add(0,2, 5,1, "8");
    add(5,2, 5,1, "9");

    // SPACERS: define the 2 columns that is section "4"
    add(4,3, 1,1, "");
    add(5,3, 1,1, "");

    JFrame frame = new JFrame("Grig Bag");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(panel);
    frame.pack();
    frame.setVisible(true);
  }

  private void add(int x, int y, int colspan, int rowspan, String name)
  {
    gbc.gridx = x;
    gbc.gridy = y;
    gbc.gridwidth = colspan;
    gbc.gridheight = rowspan;
    gbc.weightx = .1;
    gbc.weighty = .1;
    gbc.anchor = GridBagConstraints.CENTER;
    gbc.fill = GridBagConstraints.BOTH;

    // using another panel for illustrative purposes only
    JPanel p = new JPanel();

    if (!name.equals(""))
    {
      gbc.weightx = 1;                          // @SheridanVespo fix
      int index = Integer.parseInt(name);
      JLabel label = new JLabel("Panel " + name);
      p.add(label);
      p.setBackground(colors[index]);
      panel.add(p, gbc);
    }
    else
    {
      gbc.weightx = 0.5;                        // @SheridanVespo fix
      gbc.weighty = 0;  // don't allow the spacer to grow 
      gbc.fill = GridBagConstraints.NONE;
      panel.add(Box.createHorizontalGlue(), gbc);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @splungebob我找到了一种修复代码的方法:使用`gbc.weightx = a`作为面板,使用`gbc.weightx = b`作为胶水,使用`a> b> 0`.(你使用`a = b`)这样所有列都以相同的方式调整大小.@trashgod无需恢复,它是可以修复的. (2认同)