我对 Swing 还比较陌生,我正在尝试弄清楚它到底是如何工作的。如果我错了请告诉我。
我基本上已经弄清楚了放置组件所必需的 gridx 和 gridy 。您至少需要 n 个 (gridx,gridy) 值才能创建 nxn 网格。例如 (5,5),(3,3),(4,9),(3,10) 将使用上面的 (gridx,gridy) 分别放置的组件创建一个 3x4 网格空间(4 行,3 列)在单元格 (3,2),(1,2),(2,3),(1,4) 中。
weightx和weighty似乎有2个函数,weightx和weighty的>0值将网格单元拉伸(stretch)到边缘(否则它是集中的),我们还可以设置组件大小的比例 - 所以如果一个组件有gridx =0.1,而另一个是 0.2,那么后一个可能是两倍宽。但是,在调整组件比例时,会考虑组件的最小默认宽度和高度。
需要填充才能将组件拉伸(stretch)到单元格的边缘。如果没有填充,组件将保留在中心。
但在这种情况下我们可以使用 anchor 将组件定位在单元格的西北角而不是中心。
插图在单元边缘内创建一堵空间墙。
ipadx 和 ipady 插入包含单元格的列或行的边界。
但是我无法很好地弄清楚 gridwidth 和 gridheight 是如何工作的。
考虑下面这个示例。这里有 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 个单元格。
最佳答案
网格宽度、网格高度:
以单元格
为单位指定列数(对于网格宽度)或行数(对于网格高度),组件的显示区域可以被定义了这些约束的组件所占用。默认值为1
。
所以,如果对于 (R x C
) 网格;一行中有 C
个单元格。如果您希望组件占据该特定行的所有单元格,只需将 GridBigConstraint.gridWidth 设置为 C 即可。
使用GridBagConstraints.REMAINDER
指定该组件是其行(对于网格宽度)或列(对于网格高度)中的最后一个。
教程中已经有一个很好的书面示例:How to use GridBagLayout
关于java - 了解 GridBagLayout 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20238352/