GridBagLayout的用法

GridBagLayout是面板设计中最复杂的布局工具,当然用的好的话也是最方便的。

本文主要通过设计一个计算器界面的方式,来学习GridBagLayout的使用。最终的效果如下图所示:


GridBagLayout其组件的摆放都是有GridBagConstraints控制的。可以将需要设计的界面划分成许多个纵横的小网格,每个网格里面最多放置一个组件,一个组件可以占用多个网格。

网格的定义是由gridx和gridy定义的,前者表示横坐标,后者表示纵坐标,坐标是从0开始,从整个面板的左上角开始算起,所以在上图中,按钮7所在的位置gridx=0,gridy=0;以此类推,后面所有的网格位置都可以这样定义;

但是图中网格的宽度和高度是由什么定义的呢?答案是gridwidth和gridheight,为1表示占用一个网格,为2表示占用两个网格,如上图中"+"的gridwidth=1,gridheight=2;

知道这两个,就可以大体把网格划分清楚,每一个的具体位置也就有了着落。有朋友会说,我也是这样写的,但是组件怎么就那么小呢?那是因为GridBaglayout里面还有一项参数weight,她控制着组件随着面板的变化自身的变化情况,默认情况下weightx=0,weighty=0,意思是组件大小固定,不管面板如何变,自身就那么大,但是如果想让组件随面板变化的话,可以设置weightx和weighty,设置为浮点数也行,其值代表着变化的大小,也就是你宽度设为2,高度设为1的话,拉大面板会使组件越变越宽。

这三个是比较重要的Constraints,另外,还有insets,其有四个参数,表示其上左下右和相邻组件的最小间隔;ipadx和ipady表示组件间距,默认是0(其和insets不同读者可以自己摸索一下);fill参数表示当网格区域比组件大的伤害,组件是以何种方式填充区域,是全方位还是水平或竖直;anchor是区域比组件大时,组件应该显示在区域的哪个方位,西北还是东南;

下面是我实现面板显示部分的主要代码:

	private JPanel createPanel(){
		JPanel panel = new JPanel();
		
		GridBagLayout gbl = new GridBagLayout();
		GridBagConstraints gbs = new GridBagConstraints();
		panel.setLayout(gbl);
		
		panel.add(bt7);panel.add(bt8);panel.add(bt9);panel.add(btp);
		panel.add(bt4);panel.add(bt5);panel.add(bt6);
		panel.add(bt1);panel.add(bt2);panel.add(bt9);panel.add(btp);
		panel.add(bt1);panel.add(bt2);panel.add(bt3);panel.add(btm);
		panel.add(bt0);panel.add(btdot);
		panel.add(btsignleft);panel.add(btsignright);panel.add(bte);panel.add(btmp);
		panel.add(btclear);panel.add(bt);				panel.add(btd);
		panel.add(textField);
		
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=0;gbs.gridy=0;
		gbl.setConstraints(bt7, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=1;gbs.gridy=0;
		gbl.setConstraints(bt8, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=2;gbs.gridy=0;
		gbl.setConstraints(bt9, gbs);
		
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=2;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=3;gbs.gridy=0;
		gbl.setConstraints(btp, gbs);	
		
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=0;gbs.gridy=1;
		gbl.setConstraints(bt4, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=1;gbs.gridy=1;
		gbl.setConstraints(bt5, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=2;gbs.gridy=1;
		gbl.setConstraints(bt6, gbs);
		
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=0;gbs.gridy=2;
		gbl.setConstraints(bt1, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=1;gbs.gridy=2;
		gbl.setConstraints(bt2, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=2;gbs.gridy=2;
		gbl.setConstraints(bt3, gbs);
		
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=2;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=3;gbs.gridy=2;
		gbl.setConstraints(btm, gbs);
		
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=2;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=0;gbs.gridy=3;
		gbl.setConstraints(bt0, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=2;gbs.gridy=3;
		gbl.setConstraints(btdot, gbs);
		
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=0;gbs.gridy=4;
		gbl.setConstraints(btsignleft, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=1;gbs.gridy=4;
		gbl.setConstraints(btsignright, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=2;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=2;gbs.gridy=4;
		gbl.setConstraints(bte, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=3;gbs.gridy=4;
		gbl.setConstraints(btmp, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=0;gbs.gridy=5;
		gbl.setConstraints(btclear, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=1;gbs.gridy=5;
		gbl.setConstraints(bt, gbs);
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=1;gbs.gridheight=1;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=3;gbs.gridy=5;
		gbl.setConstraints(btd, gbs);
		
		gbs.fill=GridBagConstraints.BOTH;gbs.gridwidth=4;gbs.gridheight=3;
		gbs.insets=new Insets(5, 5, 5, 5);gbs.weightx=1;gbs.weighty=1;
		gbs.gridx=0;gbs.gridy=6;
		gbl.setConstraints(textField, gbs);
		
		return panel;
	}

加一句:panel增加组件的顺序非常重要,一定要按照从左到右,从上到下的顺序添加。


  • 33
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
GridBagLayoutJava中最灵活和最复杂的布局管理器之一,它可以让开发者在窗口中创建复杂的布局。它提供了一个网格和一个包含网格的单元格,网格中的每个单元格都可以放置一个组件,而单元格的大小可以根据需要进行调整。 GridBagLayout布局管理器的实现非常灵活,允许您将组件放置在网格中的任何位置,并根据需要为它们分配任意数量的行和列。由于其灵活性,使用GridBagLayout可能会比其他布局管理器更具挑战性,但是一旦掌握了它,您就可以创建出非常复杂的布局。 下面是一个简单的Java应用程序,用于演示如何使用GridBagLayout布局管理器: ```java import java.awt.*; import javax.swing.*; public class GridBagLayoutDemo { public static void main(String[] args) { JFrame frame = new JFrame("GridBagLayout Demo"); JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(5, 5, 5, 5); gbc.gridx = 0; gbc.gridy = 0; panel.add(new JLabel("Name:"), gbc); gbc.gridx = 1; gbc.gridy = 0; panel.add(new JTextField(20), gbc); gbc.gridx = 0; gbc.gridy = 1; panel.add(new JLabel("Address:"), gbc); gbc.gridx = 1; gbc.gridy = 1; panel.add(new JTextField(20), gbc); frame.add(panel); frame.setSize(300, 200); frame.setVisible(true); } } ``` 在这个示例应用程序中,我们首先创建一个JFrame和一个JPanel。然后,我们将JPanel的布局管理器设置为GridBagLayout。 接下来,我们创建一个GridBagConstraints对象,并设置它的insets属性为一个Insets对象。Insets对象是一个包含四个整数值的对象,它们分别表示组件之间的左、上、右、下边距。在这个示例中,我们将insets设置为5像素。 然后,我们使用gbc对象来指定每个组件的网格坐标,即它们应该在网格的哪个位置。我们还可以使用gbc对象来指定每个组件应该占用的行和列的数量。 最后,我们将所有组件添加到JPanel中,并将JPanel添加到JFrame中。我们还设置了JFrame的大小并使其可见。 这只是GridBagLayout的一个简单示例,但它应该足以让您开始使用这个灵活的布局管理器。要深入了解GridBagLayout的更复杂的特性和用法,请参阅Java官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值