GUI 布局管理器

布局管理器

决定组件在容器的位置和尺寸。

当然,一个容器被创建了自然会有默认的布局管理器。

分类

在java.awt中有5种布局管理器:

FlowLayout BorderLayout GridLayout GridBagLayout Cardlayout

在第一种和第二种当中:

FlowLayout——Panel\Applet

BoderLayout——Window\Frame\Dialog


FlowLayout

流水式
public static final int CENTER		//居中
public static final int	LEFT		//居左
public static final int	RiGHT		//居右
public static final int LEADING		//同开始端
public static final int	TRAILING	//同结束端


public FlowLayout()					//构造一个布局,居中对齐,默认的水平和垂直间距是5个单位
public FlowLayout(int align)		//默认构造,指定对齐方式	align:排列
public FlowLayout(int align,int hgap,int vgap)//自行构造
//horizontal gap、vertical gap水平距离、垂直距离

这里,每个按钮的水平距离30,垂直距离3

package test1;
import java.awt.*;
import java.awt.event.*;

public class Class1{
public static void main(String[] args){

	//创建Frame对象
	Frame f = new Frame("Frame窗口");
	//设置布局管理器
	f.setLayout(new FlowLayout(FlowLayout.CENTER,30,3));
	Button b = null;
	for(int i = 0;i<8;i++){
		b = new Button("按钮 - " + i);
		f.add(b);
	}
	f.setSize(300,200);
	f.setLocation(800,400);//设定相对于屏幕的位置
	f.setVisible(true);
	
}}

BorderLayout

边界式

把窗体分成五个板块,东南西北中。

BorederLayout类的常量及构造方法

public static final StringCENTER		//居中
public static final StringNORTH	
public static final StringSOUTH		
public static final StringEAST  	
public static final SringWEST	


public BorderLayout()					//构造一个布局,无间距
public FlowLayout(int hgap,int vgap)	//自行构造

package test1;
import java.awt.*;
import java.awt.event.*;

public class Class1{
public static void main(String[] args){

//创建Frame对象
	Frame f = new Frame("Frame窗口");
	
//构造BorderLayout布局管理器
	f.setLayout(new BorderLayout(10,10));
	f.add(new Button("东部"),BorderLayout.EAST);
	f.add(new Button("西部"),BorderLayout.WEST);
	f.add(new Button("南部"),BorderLayout.SOUTH);
	f.add(new Button("北部"),BorderLayout.NORTH);
	f.add(new Button("中部"),BorderLayout.CENTER);


//设定窗口位置和可见
	f.setSize(300,200);
	f.setLocation(800,400);//设定相对于屏幕的位置
	f.setVisible(true);

}}

GridLayout

网格式

安排六个按钮,两行三列,每个按钮的水瓶和垂直间距都是10;

GridLayout构造方法

GridLayout()						//构造默认布局,
GridLayout(int rows,int cols)		//指定行数、列数
GridLayout(int rows,int cols,int hgap,int vgap)//指定行数、列数;水平距离、垂直距离

package test1;
import java.awt.*;
import java.awt.event.*;

public class Class1{
public static void main(String[] args){

	//创建Frame对象
	Frame f = new Frame("Frame窗口");
	//布局管理器设置为BorderLayout
	f.setLayout(new GridLayout(2,3,10,10));
	Button b = null;
	for(int i = 0; i<6;i++){
		b = new Button("按钮 - " + i);
		f.add(b);
	}


	f.setSize(300,200);
	f.setLocation(800,400);//设定相对于屏幕的位置
	f.setVisible(true);

}}

GridBagLayout

网格包式

看名字就知道,是基于GridLayout开发的。

与GridLayout不同的是,这个允许容器的每个组件大小不同。

关键在于

GridBagConstraints对象,然后在这个对象中设置相关属性,再调用setConstraints()建立对象和受控组件的直接关联

gridx、gridy				设置组件左上角所在网格的横向和纵向索引(即所在的行和列)

gridwidth、gridheight 	设置横向、纵向跨越几个网格,默认属性是1

fill					如果组件得到的显示区域大于原本设定所需要的大小,设置如何填充

weightx、weighty		设置该组件占领容器中多余的水平方向和垂直方向空白的比例(权重!)

其中,girdx和gidy的值可以设置为RELATIVE,相关联

gidwidth、gridheight。。都设为REMAINER,则为 现在这个组件在这行或者这列上作最后一个。当都设置为RELATIVE 表示作为倒数第二个组件

weightx、weighty 的默认值是0。例如,当容器中有两个组件,weightx分别为2和1,则容器宽度增加30px时,两个组件分别增加20、10

fill可以选择四个属性之一:

NONE	默认,不改变组件大小
HORIZONTAL	水平方向填充
VERTICAL	垂直方向填充
BOTH		两个方向一起扩大,足够大到填充整个显示区域

package test1;
import java.awt.*;
import java.awt.event.*;

public class Class1{
public static void main(String[] args){

//创建Frame对象,选择GridBagLayout
	Frame f = new Frame("Frame窗口");
	GridBagLayout gb1 = new GridBagLayout();
	f.setLayout(gb1);
	
//new一个GridBagConstraints gbc
	GridBagConstraints gbc = new GridBagConstraints();

//设置gbc的属性
	gbc.fill = GridBagConstraints.BOTH;
	gbc.weightx = 2;
	gbc.weighty = 1;

	f.add(addButton("按钮1",gb1,gbc));
	f.add(addButton("按钮2",gb1,gbc));

//设置添加组件是本行的最后一个组件
	gbc.gridwidth = GridBagConstraints.REMAINDER;
//按钮3
	f.add(addButton("按钮3",gb1,gbc));
	gbc.weightx = 1;
	gbc.weighty = 1;
//按钮4
	f.add(addButton("按钮4",gb1,gbc));
	gbc.gridwidth  = 2;
//按钮5	
	f.add(addButton("按钮5",gb1,gbc));
	gbc.gridheight = 1;
	gbc.gridwidth = 1;
//按钮6
	f.add(addButton("按钮6",gb1,gbc));
	//设置添加本行最后一个组件
	gbc.gridwidth = GridBagConstraints.REMAINDER;
	gbc.gridheight = 2;

	f.add(addButton("按钮7",gb1,gbc));
	f.add(addButton("按钮8",gb1,gbc));

	f.setSize(300,200);
	f.setLocation(800,400);//设定相对于屏幕的位置
	f.setVisible(true);
	}

//返回一个可以添加的控件
private static Component addButton(String name,GridBagLayout gb1, GridBagConstraints gbc){
	Button butt = new Button(name);
	gb1.setConstraints(butt,gbc);
	return butt;
}}

CardLayout

将一些组件重叠地进行布局,就像叠放卡片,每次只会展示一个界面

构造方法、常用方法

public CardLayout(int hgap,int vgap)	//构造各组件间距为0
public CardLayout(int hgap,int vgap)	//指定间距

void show(Container parent,String name)//显示具有指定组件名称的卡片
void next(Container parent)				//下翻一张
void previous(Container parent)			//上翻一张
void first(Container parent)			//翻到第一张
void last(Container parent)				//翻到最后一张
package test1;
import java.awt.*;
import java.awt.event.*;

public class Class1{
//创建Frame对象,选择GridBagLayout
	Frame f = new Frame("Frame窗口");
	String[] names = {"第一张","第二张","第三张","第四张","第五张"};
		Panel p1 = new Panel();
		public static void main(String[] args){
		new Class1().init();
		}
	public void init(){
		final CardLayout cl = new CardLayout();
		p1.setLayout(cl);
		for(int i = 0;i<names.length;i++){
			p1.add(names[i],new Button(names[i]));
		}
	
	Panel p = new Panel();
	//创建匿名类  
	ActionListener listener = new ActionListener(){
		public void actionPerformed(ActionEvent e){
			switch(e.getActionCommand()){
			case"上一张":
				cl.previous(p1);
				break;
			case"下一张":
				cl.next(p1);
				break;
			case"第一张":
				cl.first(p1);
				break;
			case"最后一张":
				cl.last(p1);
				break;
			case"第二张":
				cl.show(p1,"第二张");
			}
		}
	};
	//创建五个事件,注册监听事件



	Button previous = new Button("上一张");
	previous.addActionListener(listener);
	Button next = new Button("下一张");
	next.addActionListener(listener);
	Button first = new Button("第一张");
	first.addActionListener(listener);
	Button last = new Button("最后一张");
	last.addActionListener(listener);
	Button second = new Button("第二张");
	second.addActionListener(listener);
	
	p.add(previous);
	p.add(next);
	p.add(first);
	p.add(last);
	p.add(second);
	f.add(p,BorderLayout.SOUTH);
	f.setSize(300,150);
	f.setLocation(500,200);
	f.setVisible(true);


}}

不使用布局管理器

容器被创建过后都会有默认的布局管理器,当然也可以取消

setLayout(null)

相应的麻烦

程序必须用到以下方法

setSize()设定窗口大小
etLocation()定位窗口相对屏幕的位置
setBounds()设置组件位置和大小

package test1;
import java.awt.*;


public class Class1{
public static void main(String[] args){

//创建Frame对象
	Frame f = new Frame("Frame窗口");
	f.setSize(300,150);
	f.setLocation(500,200);
	f.setVisible(true);
//不使用布局管理器
	f.setLayout(null);
	f.setSize(400,200);
//new两个按钮,并确定位置和大小
	Button b1 = new Button("按钮1");
	Button b2 = new Button("按钮2");
	b1.setBounds(40,60,100,30);	//(x,y,length,height)
	b2.setBounds(160,60,100,30);
//将按钮添加进入frame窗口
	f.add(b1);
	f.add(b2);
	}

}

AWT绘图

绘制几何图形,需要载入库,其中有Graphics类

import java.awt.*;

Graphics类常用方法

Arc 弧线
void drawArc(int x ,int y,int width,int height,int startAngle,int arcAngel)
多边形(椭圆)
void drawPolygon(int[] xPoints,int[] yPoints,int nPoints)

还有画直线、矩形、圆角矩形等等,不过给定参数个数、类型不同罢了。

package test1;
import java.awt.*;

class DrawFrame extends Panel{
	public void paint(Graphics g){
		g.drawArc(10,10,30,30,300,180);
		g.drawLine(50,10,70,40);
		g.drawRect(10,50,30,30);
		g.drawRoundRect(50,50,30,30,20,20);
	}
}

public class Class1 {
public static void  main(String[] args){

	//设置一个窗口
	Frame f = new Frame("原来我是一个窗口");
	Panel p = new DrawFrame();
	f.add(p);
	f.setSize(200,150);
	f.setLocation(500,400);
	f.setVisible(true);

}}

下一节:GUI Swing

posted @ 2021-11-25 16:45  Dinesaw  阅读(85)  评论(0编辑  收藏  举报