当前位置: 首页 > 知识库问答 >
问题:

了解GridBagLayout约束

寇开畅
2023-03-14

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

我已经大致了解了放置html" target="_blank">组件所需的gridx和gridy。要创建nxn网格,至少需要n个值(gridx,gridy)。例如,(5,5),(3,3),(4,9),(3,10)将创建一个3x4网格空间(4行,3列),其中使用上述(gridx,gridy)的组件分别放置在单元格(3,2),(1,2),(2,3),(1,4)中。

weightx和weighty似乎有两个函数

需要填充才能将零部件拉伸到单元的边缘。如果没有填充,构件将保持在中心。

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

插入在单元边缘内部创建一堵空间墙。

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

但我无法很好地理解gridwidth和gridheight是如何工作的。

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

如何使按钮(例如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个答案

刘和正
2023-03-14

我说我想要或多或少像这样的东西: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);

    }
}

我想我终于了解了gridwidth和gridheight的工作原理。他们从左到右,从上到下工作。它们也会在空行或空列中缺少支撑构件的情况下倒塌。

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

王俊楚
2023-03-14

你的意思是这样的。。。

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基本上告诉组件应该扩展多少列(默认值为1)。这将始终向右扩展。

网格高度(gridheight)也是如此,希望它总是向下扩展。。。

已更新

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

要实现以下目标。。。

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

cns.gridx = 3;
cns.gridy = 9;
cns.gridwidth = 1;
JPanel pnl = new JPanel();
pnl.setOpaque(false);
p1.add(pnl, cns);
杜骏祥
2023-03-14

网格宽度,网格高度:

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

因此,如果对于(R x C)的网格;一行中有C的单元格数。如果您想让一个组件占据该特定行的所有单元格,只需将GridBigConstraint.gridWidth设置为C

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

教程中已经有一个很好的书面示例:如何使用GridBagLayout

 类似资料:
  • 介绍 (Introduction) GridBagLayout类以水平和垂直方式排列组件。 类声明 以下是java.awt.GridBagLayout类的声明: public class GridBagLayout extends Object implements LayoutManager2, Serializable 字段 (Field) 以下是java.awt.Bord

  • 介绍 (Introduction) GridBagLayout类以水平和垂直方式排列组件。 Class 声明 (Class Declaration) 以下是java.awt.GridBagLayout类的声明 - public class GridBagLayout extends Object implements LayoutManager2, Serializable 字

  • 主要内容:1 Java GridBagLayout的介绍,2 Java GridBagLayout的字段,3 Java GridBagLayout的方法,4 Java GridBagLayout的案例1,5 Java GridBagLayout的案例21 Java GridBagLayout的介绍 Java GridBagLayout类用于垂直,水平或沿其基线对齐组件。 组件的大小可能不同。每个GridBagLayout对象都维护一个动态的矩形单元格网格。每个组件占据一个或多个单元格(称为其显示

  • 在具有1列和多行的面板中使用方框布局求解。

  • 我正在尝试使用GridBagLayout。我需要一个垂直和水平居中的JLabel-这很容易,我甚至不需要创建任何GridBagConstraints。我还想在右下角放置一个JButton,当我尝试这样做时,我的中间面板会向左移动,或者按钮会向上移动。 我还试图使用这里描述的其他约束http://docs.oracle.com/javase/tutorial/uiswing/layout/gridb

  • 我只想使用GridBagLayout布局组件,如图所示 我尝试了几个约束,但最终都没有得到预期的结果,所以我想知道,仅使用GridBagLayout是否真的可行。困难在于C1、C2和C3部件 C1和C2是一个组件,它将容纳其他组件,如JPanel。我已经设置了它们的最小尺寸和首选尺寸。C3是一个按钮 GUI无法调整大小 这个布局管理器我已经用了好几次了,但还是不太熟练,谢谢你的帮助。