Java AWT编程笔记-基本元素



1.AWT 和Swing

AWT是SUN在jdk中提供的基本的GUI类库,被称为Abstract Window Toolkit。AWT是窗口框架,它从不同平台的窗口系统中抽取共同组件,当程序运行时,将这些组件的创建和动作委托给所在的运行平台。也就是说,JVM调用操作系统本地的图形界面来创建和平台一致的对等体。

AWT的不足:

(1)界面丑陋,功能有限

(2)不能使用特定操作系统上复杂的图形界面组件,最多只能使用4种字体;

(3)AWT使用非常笨拙的、非面向对象的编程模式。


Swing是新的Java GUI库,Swing、AWT、辅助功能API、2D API和拖放API共同组成了JFC(Java Foundation Classes)。Swing组件全面代替了Java1.0中的AWT组件,但是使用的仍然是AWT事件模型。


2.AWT组件

所有和AWT变成相关的类,都放在java.awt包及子包中。AWT图形组件大致结构如下:



3.AWT容器

容器Container是Component的一个子类,可以盛装普通的Component。F


Window:可独立存在的顶级窗口;

Panel:可作为容器,但是不能独立存在,必须放在其它容器中。常用组件。

Frame:Window子类,有标题,能通过拖拉改变窗口的位置和大小;初始化不可见,通过setVisible(true),显示;默认使用BorderLayout作为布局管理器(下一节介绍)。很常用。

ScrollPane:带滚动条的容器,不能单独存在。

测试代码:

import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextField;

public class TestFrame {

	public static void main(String[] args) {
		Frame f = new Frame("测试窗口");
		Panel p = new Panel();
		//添加组件
		p.add(new TextField());
		p.add(new Button("单机我"));
		//添加到Frame
		f.add(p);
		
		//frame位置
		f.setBounds(30,30,250,200);
		//frame可见
		f.setVisible(true);

	}

}

效果图:



4.布局管理器Layout

容器里面放组件,但是组件的布局由布局管理器控制,上面的示例代码中没有设置布局,使用默认的布局管理器。

AWT常用布局管理器:

(1)FlowLayout:组件像水流一样向某方向排列,遇到边界就折回。默认方向向左。

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;

public class TestFlowLayout {

	public static void main(String[] args) {
		Frame f = new Frame("FlowLayout");
		
		//设置FlowLayout,左对齐
		f.setLayout(new FlowLayout(FlowLayout.LEFT));

		//添加10个按钮
		for(int i=0;i<10;i++){
			f.add(new Button("button" + i));			
		}
		
		f.setBounds(30, 30, 300, 200);
		
		f.setVisible(true);
	}

}


(2)BorderLayout:将容器分为EAST、SOUTH、WEST、NORTH和CENTER五个区域,组件可以被放置在其中的任意一个。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;

public class TestBorderLayout {

	public static void main(String[] args) {
		Frame f = new Frame("Border");
		
		//设置BorderLayout,水平间距30,垂直间距20
		f.setLayout(new BorderLayout(30,20));
		
		f.add(new Button("南"), BorderLayout.SOUTH);
		f.add(new Button("北"), BorderLayout.NORTH);
		f.add(new Button("东"), BorderLayout.EAST);
		f.add(new Button("西"), BorderLayout.WEST);
		f.add(new Button("中"), BorderLayout.CENTER);
		f.add(new Button("中2"), BorderLayout.CENTER);
		
		f.pack();
		f.setVisible(true);

	}

}

效果图:


重复添加位置,后一个会覆盖前面,5个位置不用全部添加,BorderLayout会自动调整。

(3)GridLayout:将容器分割为纵横线分割的网格,每个网格一样大。

这个好理解。


(4)GridBagLayout:功能最强大,也是最复杂的布局管理器,与GridLayout不同的是:GridBagLayout中的组件可以跨越多个网格,并可以设置各个网格大小不同。

为了控制容器中的组件大小和跨越性,java提供了GridBagConstraints。

示例代码:

package se.example.awt;

import java.awt.Button;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

public class TestGridBag {

	
	private Frame f = new Frame("测试窗口");
	private GridBagLayout gb = new GridBagLayout();
	private GridBagConstraints gbc = new GridBagConstraints();
	private Button[] bs = new Button[10];
	public void init()
	{
		f.setLayout(gb);
		for (int i = 0; i < bs.length ; i++ )
		{
			bs[i] = new Button("按钮" + i);
		}
		//所有组件都可以横向、纵向上扩大
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 1;
        addButton(bs[0]);
        addButton(bs[1]);
        addButton(bs[2]);
		//该GridBagConstraints控制的GUI组件将会成为横向最后一个元素
		gbc.gridwidth = GridBagConstraints.REMAINDER;
        addButton(bs[3]);
		//该GridBagConstraints控制的GUI组件将横向上不会扩大
        gbc.weightx = 0;
        addButton(bs[4]);
		//该GridBagConstraints控制的GUI组件将横跨2个网格
		gbc.gridwidth = 2;
        addButton(bs[5]);
		//该GridBagConstraints控制的GUI组件将横跨1个网格
		gbc.gridwidth = 1;
		//该GridBagConstraints控制的GUI组件将纵向跨2个网格
		gbc.gridheight = 2;
		//该GridBagConstraints控制的GUI组件将会成为横向最后一个元素
		gbc.gridwidth = GridBagConstraints.REMAINDER;
        addButton(bs[6]);
		//该GridBagConstraints控制的GUI组件将横向跨越一个网格,纵向跨越2个网格。
		gbc.gridwidth = 1;
		gbc.gridheight = 2;
		//该GridBagConstraints控制的GUI组件纵向扩大的权重是1
        gbc.weighty = 1;
        addButton(bs[7]);
		//设置下面的按钮在纵向上不会扩大
        gbc.weighty = 0;
		//该GridBagConstraints控制的GUI组件将会成为横向最后一个元素
		gbc.gridwidth = GridBagConstraints.REMAINDER;
		//该GridBagConstraints控制的GUI组件将纵向上横跨1个网格
		gbc.gridheight = 1;
        addButton(bs[8]);
        addButton(bs[9]);
		f.pack();
		f.setVisible(true);
	}
	
    private void addButton(Button button) 
	{
        gb.setConstraints(button, gbc);
        f.add(button);
    }
	public static void main(String[] args) {
		TestGridBag tgb = new TestGridBag();
		tgb.init();

	}

}

效果图:



(5)CardLayout:以时间而非空间来管理它的组件,将加入容器的所有组件看做一叠卡片,每次只有上面的那个组件才可见。并提供方法控制显示的组件。

CardLayout的常用方法:first(Container c);last(Container c);previous(Container c);next(Container c);show(Container c ,String name)。


(6)BoxLayout:Swing引入的一个新的布局管理器。保留了GridBagLayout的许多优点,却更简单。可以在垂直和水平方向上摆放组件。

package se.example.awt;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;

import javax.swing.Box;

public class TestBoxLayout {
	
	
	private Frame f = new Frame("测试");
	//定义水平摆放组件的Box对象
	private Box horizontal = Box.createHorizontalBox();
	//定义垂直摆放组件的Box对象
	private Box vertical = Box.createVerticalBox();
	public void init()
	{
		horizontal.add(new Button("水平按钮一"));
		horizontal.add(Box.createHorizontalGlue());
		horizontal.add(new Button("水平按钮二"));
		//水平方向不可拉伸的间距,其宽度为10px
		horizontal.add(Box.createHorizontalStrut(10));
		horizontal.add(new Button("水平按钮三"));
		vertical.add(new Button("垂直按钮一"));
		vertical.add(Box.createVerticalGlue());
		vertical.add(new Button("垂直按钮二"));
		//垂直方向不可拉伸的间距,其高度为10px
		vertical.add(Box.createVerticalStrut(10));
		vertical.add(new Button("垂直按钮三"));
		f.add(horizontal , BorderLayout.NORTH);
		f.add(vertical);
		f.pack();
		f.setVisible(true);
	}

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

	}

}

效果图:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值