了解GridBagLayout约束

时间:2013-11-27 09:23:42

标签: java swing layout-manager gridbaglayout

我相对较新,我试图弄清楚它是如何工作的。告诉我,如果我错了。

我主要想出了放置组件所需的gridx和gridy。您至少需要n个值(gridx,gridy)才能创建nxn网格。例如(5,5),(3,3),(4,9),(3,10)将创建一个3x4网格空间(4行,3列),其中组件分别使用上面的(gridx,gridy)放置在细胞(3,2),(1,2),(2,3),(1,4)中。

weightx和weighty似乎有两个函数,一个> 0的weightx值和weighty将网格单元拉伸到边缘(否则它是集中的)我们也可以设置比例到组件的大小 - 所以如果一个组件有gridx = 0.1,anothr为0.2,然后后者可能是两倍宽。但是,在按比例分量时,会考虑组件的最小默认宽度和高度。

需要填充以将组件拉伸到单元格的边缘。如果没有填充,组件将保持在中心位置。

但我们可以在这种情况下使用锚点来定位组件,比如沿着单元格的西北角而不是中心。

insets在单元格边缘内创建一个空间墙。

ipadx和ipady推动包含单元格的列或行的边界。

但是我无法弄清楚网格宽度和网格高度是如何工作的。

考虑下面的示例。这4个按钮放在单元格b1(3,2),b2(1,1),b3(2,3),b4(4,4)中 4x4网格空间。

如何使按钮(例如b2或b4)占据其占据的单元格的整行或列?

import javax.swing.*;
import java.awt.*;
//import java.awt.event.*;
public class Swing29a
{
public static void main(String[] args)
{
JFrame f1= new JFrame("GridBag Layout Test");

f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f1.setResizable(true);
f1.setLocation(200,100);
f1.setSize(800,800);

JPanel p1 = new JPanel();
p1.setBackground(Color.black);
f1.add(p1);


JButton b1= new JButton("Button 1");
b1.setBackground(Color.white);

JButton b2= new JButton("Button 2");
b2.setBackground(Color.white);

JButton b3= new JButton("Button 3");
b3.setBackground(Color.white);

JButton b4= new JButton("Button 4");
b4.setBackground(Color.white);



GridBagLayout gm1= new GridBagLayout();
p1.setLayout(gm1);
GridBagConstraints cns =new GridBagConstraints();

cns.gridx=5;
cns.gridy=5;
cns.weightx=0.1;
cns.weighty=0.1;
cns.fill=GridBagConstraints.BOTH;

p1.add(b1,cns);

cns.gridx=3;
cns.gridy=3;
p1.add(b2,cns);


cns.gridx=4;
cns.gridy=9;
p1.add(b3,cns);

cns.gridx=7;//3;
cns.gridy=10;
cns.gridheight=3;
cns.weightx=0.2;
cns.weighty=0.2;
//cns.weightx=10.0;
//cns.weighty=9.0;    
//cns.ipadx=50;
//cns.ipady=50;
p1.add(b4,cns);

f1.setVisible(true);

}
}

修改 这是图片链接 http://postimg.org/image/wae2x4w4z/

我希望任何按钮能够填充整行或列,或连续至少取2个单元格。

3 个答案:

答案 0 :(得分:1)

gridwidth,gridheight

cells为单位指定列数(对于gridwidth)或行(对于gridheight),组件的显示区域可以由添加了这些约束的组件占用。默认值为1

所以,如果对于(R x C)的网格;一行中有C个单元格。如果您希望组件占用该特定行的所有单元格,只需将GridBigConstraint.gridWidth设置为C即可。

使用GridBagConstraints.REMAINDER指定组件是其行中的最后一个组件(对于gridwidth)或列(对于gridheight)。

教程中已有一个很好的书面示例:How to use GridBagLayout

答案 1 :(得分:1)

你的意思是这样......

enter image description here

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GridBagTest {

    public static void main(String[] args) {
        JFrame f1 = new JFrame("GridBag Layout Test");

        f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f1.setResizable(true);
        f1.setLocation(200, 100);
        f1.setSize(800, 800);

        JPanel p1 = new JPanel();
        p1.setBackground(Color.black);
        f1.add(p1);

        JButton b1 = new JButton("Button 1");
        b1.setBackground(Color.white);

        JButton b2 = new JButton("Button 2");
        b2.setBackground(Color.white);

        JButton b3 = new JButton("Button 3");
        b3.setBackground(Color.white);

        JButton b4 = new JButton("Button 4");
        b4.setBackground(Color.white);

        GridBagLayout gm1 = new GridBagLayout();
        p1.setLayout(gm1);
        GridBagConstraints cns = new GridBagConstraints();

        cns.gridx = 5;
        cns.gridy = 5;
        cns.weightx = 0.1;
        cns.weighty = 0.1;
        cns.fill = GridBagConstraints.BOTH;

        p1.add(b1, cns);

        cns.gridx = 3;
        cns.gridy = 3;
//        cns.gridheight = GridBagConstraints.REMAINDER;
        cns.gridwidth = 3;
        p1.add(b2, cns);

        cns.gridheight = 1;
        cns.gridwidth = 1;
        cns.gridx = 4;
        cns.gridy = 9;
        p1.add(b3, cns);

        cns.gridx = 6;
        cns.gridy = 3;
        cns.gridheight = 7;
        cns.weightx = 0.2;
        cns.weighty = 0.2;
//        cns.gridheight = 4;
        p1.add(b4, cns);

        f1.setVisible(true);

    }
}

gridwidth基本上告诉GridBagLayout组件应扩展多少列(默认值为1)。这将始终正确扩展。

gridheight做同样的事情,期望它会一直向下扩展......

<强>更新

GridBagLayout非常强大,但即便如此,有时它也有局限性。

实现类似......

enter image description here

最简单的选择是添加“填充”组件,例如......

cns.gridx = 3;
cns.gridy = 9;
cns.gridwidth = 1;
JPanel pnl = new JPanel();
pnl.setOpaque(false);
p1.add(pnl, cns);

答案 2 :(得分:0)

我说我想要像这样或多或少的东西: http://postimg.org/image/7a5vi8t21/

并且由于所有的澄清,我能够或多或少地做到这一点。 我使用了一个额外的透明按钮。 这是输出图像: http://postimg.org/image/6yw3c8b37/

以下是代码

import javax.swing.*;
import java.awt.*;
//import java.awt.event.*;

public class GridBagTest2 
{

    public static void main(String[] args) {
        JFrame f1 = new JFrame("GridBag Layout Test");

        f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f1.setResizable(true);
        f1.setLocation(200, 100);
        f1.setSize(800, 800);

        JPanel p1 = new JPanel();
        p1.setBackground(Color.black);
        f1.add(p1);

        JButton b1 = new JButton("Button 1");
        b1.setBackground(Color.white);

        JButton b2 = new JButton("Button 2");
        b2.setBackground(Color.white);

        JButton b3 = new JButton("Button 3");
        b3.setBackground(Color.white);

        JButton b4 = new JButton("Button 4");
        b4.setBackground(Color.white);

        JButton b5 = new JButton("        ");
        b5.setBackground(Color.white);
        b5.setBorderPainted(false);
        b5.setOpaque(false);

        JLabel lb1 = new JLabel("");
        //lb1.setOpaque(true);

        GridBagLayout gm1 = new GridBagLayout();
        p1.setLayout(gm1);
        GridBagConstraints cns = new GridBagConstraints();

        cns.gridx = 5;
        cns.gridy = 5;
        cns.weightx = 0.1;
        cns.weighty = 0.1;
        cns.fill = GridBagConstraints.BOTH;

        p1.add(b1, cns);

        cns.gridx = 3;
        cns.gridy = 3;

        cns.gridwidth = 3;
        p1.add(b2, cns);

        cns.gridheight = 1;
        cns.gridwidth = 1;
        cns.gridx = 4;
        cns.gridy = 9;
        p1.add(b3, cns);

        cns.gridx = 7;
        cns.gridy = 3;
        cns.gridheight = 8;
        cns.weightx = 0.2;
        cns.weighty = 0.2;

        p1.add(b4, cns);


        cns.gridx = 3;
        cns.gridy = 10;
        cns.gridheight=1;
        cns.gridwidth = 1;
        cns.weightx = 0.1;
        cns.weighty = 0.1;
        p1.add(b5, cns);


        f1.setVisible(true);

    }
}

我想我终于明白了网格宽度和网格高度是如何工作的。它们从左到右,从上到下工作。它们也因空支持空行或列中的组件而坍塌。

然而,还有一些我不明白的问题。如果我使用透明标签(lb1)而不是透明按钮b5,则列的尺寸会发生变化。另外,为什么b4不是其他按钮的两倍宽,尽管重量是两倍?