GUI之布局管理器(二)

上篇我们已经介绍了FlowLayout 、BordLayout、CardLayout、GridLayout等四种布局管理器,本篇我们继续补充其它几种布局管理器。

五、GridBagLayout(网格包布局)

1、特点:

    a、与其他布局相比,网格布局要复杂得多,不过也相对灵活;

    b、与网格布局相比,网格包布局允许组件大小各不相同,且一个组件可跨越一个或多个网格;

    c、网格包布局还需创建一个或多个GridBagContraints对象,用来设置布局约束条件;

    d、需通过调用setConstraints( )方法建立GridBagContraints对象和受控组件的关联;

    e、GridBagContraints是网格包布局的核心,其对象可重复使用,只需改变相关属性即可。

2、构造方法:

     GridBagLayout( );   

    GridBagContraints();

    GridBagContraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady);

 GridBagLayout只有一种无参构造方法;

而GridBagContraints有两种构造方法,其中第一种构造方法将所有字段设为默认值;第二种构造方法将其所有字段设置为传入参数,各参数作用如下:

gridx和gridy:设置组件的左上角所在网格的横向和纵向索引,默认值为GridBagContraints.RELATIVE,表示当前组件紧跟上一组件后面;

gridwidth和gridwidth:设置组件横向、纵向跨越网格数,默认值为1,当把其值设为GridBagConstraints.REMAINDER,表示当前组件为所在行或列上的最后一个组件;

weightx和weighty:设置组件占领容器水平和垂直方向多余空白区域的比例(即权重),默认值为0,即不占领多余空间;

anchor:指定组件应置于其显示区域中何处。可能的值有三种:绝对值、相对于方向的值和相对于基线的值,默认值为相对于基线的GridBagConstraints.CENTER值;

fill:设置当组件的显示区域大于组件需要大小时,组件是否以及如何改变大小,可接收以下几个属性值:

        NONE:默认,不改变组件大小;

        BOTH:使组件足够大,以填充整个显示区域;

        HORIZONTAL: 使组件水平方向足够长以填充显示区域,但高度不变;

        VERTICAL:使组件垂直方向足够高以填充显示区域,但长度不变;

insets:指定组件的外部填充,即组件与其显示区域边缘之间间距的最小量;

ipadx和ipady:指定布局中组件的内部填充,即对组件最小大小的添加量;

3示例:

package com.Liao.SwingTest0820;

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

public class GridBaglayout extends JFrame {
	
	private static final long serialVersionUID = -7694364258203261443L;
	private GridBagLayout layout =new GridBagLayout();
	private int count;
	public static void main(String[] args) {
		new GridBaglayout().init();
	}
	
	public void init() {
		setDefaultCloseOperation(3);
		setLocationRelativeTo(null);
		setLayout(layout);//设置网格包布局
		//创建GridBagConstraints对象,设置约束条件
		GridBagConstraints c=new GridBagConstraints();
		
		c.fill=GridBagConstraints.BOTH;//使组件足够大,以填充整个显示区域
		c.weightx=1;//水平方向权重设为1
		c.weighty=1;//垂直方向权重设为1
		addButton(c);//调用添加按钮方法
		addButton(c);
		addButton(c);
		c.gridwidth=GridBagConstraints.REMAINDER;//设为所在行最后一个组件
		addButton(c);
		
		c.weightx=0;//水平方向权重设为0,本行唯一一个组件,此处设置无效
		c.weighty=0;//垂直方向权重设为0,不跟随容器变化而变化
		addButton(c);
	
		c.gridwidth=1;//设为水平方向占1个网格
		addButton(c);
		
		c.gridwidth=GridBagConstraints.REMAINDER;//设为所在行最后一个组件
		addButton(c);
		
		c.gridheight=2;//设为垂直方向占2个网格
		c.gridwidth=1;//设为水平方向占1个网格
		c.weightx=2;//水平方向权重设为2
		c.weighty=2;//垂直方向权重设为2
		addButton(c);
		
		c.gridwidth=GridBagConstraints.REMAINDER;//设为所在行最后一个组件
		c.gridheight=1;//垂直方向权重设为1
		addButton(c);
		addButton(c);
		pack();//调整此窗口的大小,以适合其子组件的首选大小和布局
		setVisible(true);
	}
	//添加按钮方法
	public void addButton(GridBagConstraints c) {
		JButton jb=new JButton("按钮"+(++count));
		layout.setConstraints(jb, c);
		add(jb);
	}
}

4、效果图:

六、BoxLayout(盒式布局)

1、特点:

a、盒式布局允许垂直或水平布置多个组件,这些组件将不包装,因此重新调整框架的大小时组件的排列方式不改变;

b、BoxLayout 管理器是通过 axis 参数指定布局类型;

c、使用BoxLayout布局时,常常需要借助Box类辅助布局设计,Box类是使用 BoxLayout 的轻量级容器;

d、Box 类可以创建几种影响布局的不可见组件:Glue、Strut 和 RigidArea:

       RigidArea: 用来创建一个具有指定大小的透明组件;

       Struts:创建一个定义一个方向(水平或垂直)尺寸的透明组件,不能同时定义水平和垂直尺寸;

       Glue:创建一个不可见的 "glue" 组件,它会尽可能的占据两个控件之间的多余空间;

2、构造方法:

      BoxLayout(Container target, int axis)

     参数taget指定需要布置的容器,参数axis指定布置组件时使用的轴可选值有:

      X_AXIS:从左到右水平布置组件;

      Y_AXIS:从上到下垂直布置组件;

      LINE_AXIS:指定根据目标容器的 ComponentOrientation 属性确定的文本行方向放置组件;

      PAGE_AXIS :指定根据目标容器的 ComponentOrientation 属性确定的文本行在页面中的流向来放置组件。

3、示例:

package com.Liao.SwingTest0820;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Boxlayout extends JFrame {

	private static final long serialVersionUID = -4193345082031158245L;
	private int i;
	public static void main(String[] args) {
		new Boxlayout().init();
	}

	private void init() {
		setSize(300, 300);
		setDefaultCloseOperation(3);
		setLocationRelativeTo(null);
		// 设置流式布局
		setLayout(new FlowLayout());
		
		// 添加JPanel容器
		JPanel jp1=new JPanel();
		//添加指定颜色和线宽的边界
		jp1.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2));
		//设置水平方向盒式布局
		BoxLayout b1=new BoxLayout(jp1, BoxLayout.X_AXIS);
		jp1.setLayout(b1);
		//添加按钮及不可见组件gridArea
		jp1.add(new JButton("按钮"+(++i)));
		jp1.add(Box.createRigidArea(new Dimension(30, 30)));
		jp1.add(new JButton("按钮"+(++i)));
		jp1.add(Box.createRigidArea(new Dimension(30, 30)));
		//jp1.add(Box.createHorizontalStrut(30));
		jp1.add(new JButton("按钮"+(++i)));
		
		// 添加JPanel容器
		JPanel jp2=new JPanel();
		jp2.setPreferredSize(new Dimension(80, 200));//设置容器大小
		jp2.setBorder(BorderFactory.createEtchedBorder());//添加边界
		//设置垂直方向盒式布局
		BoxLayout b2=new BoxLayout(jp2, BoxLayout.Y_AXIS);
		//添加按钮及不可见组件strut
		jp2.setLayout(b2);
		jp2.add(Box.createGlue());
		jp2.add(new JButton("按钮"+(++i)));
		jp2.add(Box.createVerticalStrut(10));
		jp2.add(new JButton("按钮"+(++i)));
		jp2.add(Box.createGlue());
		jp2.add(new JButton("按钮"+(++i)));
		
		// 添加JPanel容器,不添加Box组件
		JPanel jp3=new JPanel();
		//
		jp3.setBorder(BorderFactory.createTitledBorder("不添加Box"));
		BoxLayout b3=new BoxLayout(jp3, BoxLayout.PAGE_AXIS);
		jp3.setLayout(b3);
		jp3.add(new JButton("按钮"+(++i)));
		jp3.add(new JButton("按钮"+(++i)));
		jp3.add(new JButton("按钮"+(++i)));
		//添加JPanel容器至窗口
		add(jp1);
		add(jp2);
		add(jp3);
		setVisible(true);
	}
}

4、效果图:

关于盒式布局的详细用法,可参考文章:https://blog.csdn.net/u011402896/article/details/79770729

七、null(绝对布局)

1、特点:

     a、通过setLayout(null)取消系统默认布局;

     b、添加组件时通过调用setSize()和setLocation()或者setBounds()方法来设定组件位置及大小;

2、示例:

package com.Liao.SwingTest0820;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Nulllayout extends JFrame {

	private static final long serialVersionUID = -4193345082031158245L;

	public static void main(String[] args) {
		new Nulllayout().init();
	}

	private void init() {
		setSize(300, 300);
		setDefaultCloseOperation(3);
		setLocationRelativeTo(null);
		// 取消默认布局
		setLayout(null);
		// 添加按钮
		JButton jbu=new JButton("点击");
		jbu.setBounds(50, 40, 100, 100);//设定按钮位置及大小
		add(jbu);
		//添加标签
		JLabel jl=new JLabel("空布局");
		jl.setSize(100,50);//设定大小
		jl.setLocation(200,100);//设定位置
		add(jl);
		setVisible(true);
	}
}

3、效果图:

八、补充

前面有提过,容器组件都有默认布局,其中Window、Frame、Dialog的默认布局管理器为BordLayout,Panel的默认布局管理器为FlowLayout。

好了,布局管理器就介绍到这了。其实,在实际设计过程中,不能局限使用一种布局,可以根据需要采用多种布局,一切只为了设计的界面更加友好和美观!

猜你喜欢

转载自blog.csdn.net/LIAO_7053/article/details/82121388