Java的图形用户界面——布局管理(三)

布局的概念:

布局是指组件在容器中的排列方式,主要有:

1.流式布局FlowLayout

以行为单位依此排列各组件,一行排不下时另起一行
JPanel的默认布局
该布局适用于组件个数较少的情况。
缺点:当用户对由FlowLayout布局管理的区域进行缩放时,布局会发生变化
构造方法:

  • FlowLayout();
  • FlowLayout(int align); //align一般取值有:CENTER、LEFT、RIGHT
  • FlowLayout(int alig,int hgap,int vgap); //hgap和vgap指定组件与容器起始边界以及组件间的水平和垂直间距,默认值为5个像素
    例如:FlowLayout layout = new FlowLayout(FlowLayout.LEFT,10,10);

FlowLayout布局的使用:
创建FlowLayout布局对象:

  • FlowLayout fl = new FlowLayout();

创建容器对象:

  • JPanel panel = new JPanel();

设置容器对象的布局或使用默认布局:

  • panel.setLayout(fl);

向容器中添加组件对象(设组件对象已创建):

  • panel.add(组件对象);
2.边界布局BorderLayout

按照东、西、南、北、中5个方位排列各组件
顶层容器JFrame、JApplet、JDialog、JWindow的默认布局
缺点:当加入的组件超过5个时,就必须使用容器的嵌套或其它布局
优点:当容器缩放时,组件相应的位置不变化,但大小改变
构造方法:

  • BorderLayout();
  • BorderLayout(int hgap,int vgap); //hgap和vgap指定组件间的水平和垂直间距,默认值为0个像素

BorderLayout布局的使用
创建BorderLayout布局对象:

  • BorderLayout bl = new BorderLayout();

创建容器对象:

  • JPanel panel = new JPanel();

设置容器对象的布局或使用默认布局:

  • panel.setLayout(bl);

向容器中添加组件对象(设组件对象已创建):

  • panel.add(组件对象,方位);
    //方位的取值为:
    BorderLayout.EAST 或“East”
    BorderLayout.WEST 或“West”
    BorderLayout.SOUTH 或“South”
    BorderLayout.NORTH 或“North”
    BorderLayout.CENTER 或“Center”(默认)

在这里插入图片描述
代码:

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

public class BorderDemo extends JFrame{
	JButton bn,bs,bw,be,bc;
	public BorderDemo(){  
		super("BorderLayout  Demo");
		Container c=getContentPane();
		c.setLayout(new BorderLayout());
		bn=new JButton("北");
		bs=new JButton("南");
		be=new JButton("东");
		bw=new JButton("西");
		bc=new JButton("中");
		c.add("North",bn);
		c.add(bs,"South");
		c.add(BorderLayout.EAST,be);
		c.add(bw,BorderLayout.WEST);
		c.add("Center",bc);
		setSize(400,400);
		setVisible(true);
	}
	
	public static void main(String args[]){
		new BorderDemo();
	}
}
3.网格布局GridLayout

按照二维网格以相同大小依此排列各组件
该布局适用于组件个数较多的情况
优点:组件的相应位置不随区域的缩放而改变,只是组件的大小改变。
构造方法:

  • GridLayout(); //一行、每个组件一列
  • GridLayout(int rows,int cols); //行列数
  • GridLayout(rows,cols,int hgap,int vgap); //行行、列列的间距,默认值为0个像素 布局的使用

创建GridLayout布局对象:

  • GridLayout gl = new GridLayout(2,2);

创建容器对象:

  • JPanel panel = new JPanel();

设置容器对象的布局或使用默认布局:

  • panel.setLayout(gl);

向容器中添加组件对象(设组件对象已创建)

  • panel.add(组件对象);

在这里插入图片描述

4.卡片布局CardLayout

以一叠卡片的形式依此排列个组件
构造方法:

  • CardLayout();
  • CardLayout(int hgap,int vgap); //组件与容器间距,默认值为0个像素
  • 创建CardLayout cl = new CardLayout();

创建容器对象:

  • JPanel panel = new JPanel();

设置容器对象的布局或使用默认布局:

  • panel.setLayout(cl);

向容器中添加组件对象(设组件对象已创建):

  • panel.add(组件对象,“名称”);

显示组件:

  • cl.show(panel,“名称”);
  • cl.first(panel);
  • cl.last(panel);
  • cl.next(panel);
  • cl.previous(panel);

在这里插入图片描述
代码:

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

public class CardDemo extends JFrame implements ActionListener{
	CardLayout card=new CardLayout();
  	Container c=getContentPane();
  	public CardDemo(){
  		super("CardLayout Demo");
   		JButton cb[]=new JButton[6];
   		c.setLayout(card);
   		for(int i=1;i<=5;i++){
			cb[i]=new JButton("卡片号为:"+i);
            cb[i].addActionListener(this);
     		c.add(String.valueOf(i),cb[i]);    //String.valueOf(i),该方法返回一个int参数的字符串表示形式
     	}
        card.show(c,String.valueOf(4));
        setSize(400,400);
        setVisible(true);
  	}
	
  	public void actionPerformed(ActionEvent e){
		card.next(c);
  	}
	
 	public static void main(String args[]){
  		new CardDemo();
	}
}
5.盒式布局BoxLayout

以一行或一列的方式依此排列各组件
容器Box的默认布局为且只能为BoxLayout
javax.swing.Box 类的使用
创建Box对象:

  • Box b1 = Box.createHorizontalBox();

创建一个从左到右显示其组件的Box

  • Box b2 = Box.createVerticalBox();
    创建一个从上到下显示其组件的Box

向盒子中添加组件对象(设已创建):

  • b1.add(组件对象);

向盒子中添加必要的透明组件
添加Glue:Glue用来对组件进行挤压,产生左对齐、右对齐或两端对齐的效果

  • b1.add(Box.createHorizontalGlue());
  • b2.add(Box.createVerticalGlue());

添加Strut:Strut用来加入组件间的间距

  • b1.add(Box.createHorizontalStruct(5));
  • b2.add(Box.createVerticalStruct(5));

添加RigidArea:RigidArea用来设置组件的间距和高度(宽度和间距)

  • Dimension d = new Dimension(50,80);
  • b1.add(Box.createRigidArea(d));
  • b2.add(Box.createRigidArea(d));
6.网格包布局GridBagLayout

从网格出发来布局组件,但一个组件在横向和纵向上都可以占据多个网格,灵活但比较复杂
使用GridBagConstraints指定组件在布局时的有关约束值
属性(11个):

  • gridx,gridy - 位置
  • gridwidth,gridheight - 占据网格数
  • anchor - 方位
  • fill - 充满方式
    javax.awt.GridBagConstraints.HORIZONTAL
    javax.awt.GridBagConstraints.VERTICAL
    javax.awt.GridBagConstraints.BOTH

创建对象:

  • GridBagConstraints gbc1,gbc2;
  • gbc1 = new GridBagConstraints();
  • gbc2 = new GridBagConstraints(,);

布局的使用

  • GridBagLayout gbl = new GridBagLayout();
  • JPanel panel = new JPanel();
  • panel.setLayout(gbl);
  • GridBagConstraints gbc = new GridBagConstraints();
    ,//设置
  • Jbutton button = new JButton(“Button”);
  • panel.add(button,gbc);

一般布局步骤:

  • 画出组件布局草图
  • 确定每个组件应占据的网格
  • 分别在x和y方向上为网格标上序号
  • 组件的gridx,gridy,gridwidth,gridheight据填充和对齐要求设置fill和anchor值
  • 须保持默认大小的组件的weightx和weighty值设为0,其余的设为100
  • 看是否需要设置填塞值insert和ipadx、ipady
  • 编写代码,运行程序,观察结果,必要时进行修改
7.空布局(不使用布局)null

不使用任何布局管理器,一般不使用该方式
创建容器对象:

  • JPanel panel = new JPanel();

设置容器对象的布局为null:

  • panel.setLayout(null);

设置组件在容器中的位置:

  • 组件对象.setBounds(x,y,width,height);

向容器中添加组件对象(设已创建):

  • panel.add(组件对象);

注意:对于一些复杂的情况,往往需要使用容器的嵌套,各容器可使用不同的布局。当容器的尺寸改变时,布局管理器会自动调整组件的排列

在这里插入图片描述
代码:

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

public class NullLayout extends JFrame{
	JButton b1=new JButton("按钮1");
   	JButton b2=new JButton("按钮2");
   	JButton b3=new JButton("按钮3");
  	JLabel lb=new JLabel("看我们的摆放位置,很随意!!");
   	public NullLayout(){
		super("nullLayout Demo");
		Container c=getContentPane();
		c.setLayout(null);
   	  	c.add(lb);
		lb.setBounds(300,190,200,30);
   		c.add(b1);
		b1.setBounds(20,30,90,30);
    	c.add(b2);
  	  	b2.setBounds(100,70,90,30);
  	  	c.add(b3);
   	 	b3.setBounds(150,120,90,50);
   	 	setSize(540,480);
   		setVisible(true);
	}
   	public static void main(String args[]){
   		new NullLayout();
   	}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值