AWT:抽象窗口组件工具包

  Abstract Windows Toolkit(AWT)是最原始的 Java GUI 工具包。AWT 的主要优点是,它在 Java 技术的每个版本上都成为了一种标准配置,包括早期的 Web 浏览器中的 Java 实现;另外它也非常稳定。这意味着我们不需要单独安装这个工具包,在任何一个 Java 运行环境中都可以使用它,这一点正是我们所希望的特性。

AWT包中最基本的关系是 组件、容器、布局管理器、事件之间的关系

容器类派生出  容器框架类(Frame) 面板类(Panel)

fram默认的布局管理器是  BorderLayout

那现在开始就先讲AWT。AWT类包含在java.awt包中,主要包括用户界面组件、事件处理模型、图形和图像工具、布局管理器等。Java.awt包中的主要类及组件类的继承关系如图

(图片来自《疯狂Java讲义》--李刚)

AWT布局管理器有以下5种:

FlowLayout

BorderLayout

CardLayout

GridLayout

GridBagLayout

1.顺序布局(FlowLayout)是Panel容器的缺省布局策略,即将加入容器中的组件依次从左至右,从上至下排列,适用于组件个数较少的情况。eg

public class TestFlowLayout
{
public static void main(String[] args)
{
Frame f = new Frame("测试窗口");
//设置Frame容器使用FlowLayout布局管理器
f.setLayout(new FlowLayout(FlowLayout.LEFT , 20, 5));
//向窗口中添加10个按钮
for (int i = 0; i < 10 ; i++ )
{
f.add(new Button("按钮" + i));
}
//设置窗口为最佳大小
f.pack();
//将窗口显示出来(Frame对象默认处于隐藏状态)
f.setVisible(true);
}
}

  

2.边界布局(BorderLayout)是Frame,Dialog,ScrollPane的缺省布局。区域布局将容器分为东西南北中五个区域,加入组件时,应通过字符串East/West /South/North/Center来标记组件的方位。

public class FrameExample {
public static void main(String args[]){
Frame m_form = new Frame("Title");
m_form.setLayout(new BorderLayout(10,10));//设置组件的间距分别为10
m_form.setSize(300, 300);
Button north = new Button("北"); m_form.add(north,BorderLayout.NORTH);
m_form.add(new Button("南"),BorderLayout.SOUTH);
m_form.add(new Button("南"),BorderLayout.SOUTH);
m_form.add(new Button("西"),BorderLayout.WEST);
m_form.add(new Button("东"),BorderLayout.EAST);
//m_form.add(new Button("中"));
m_form.add(new Label("中间标签控件"),BorderLayout.CENTER);
m_form.setVisible(true);
}
}

3.卡片布局(CardLayout)将容器中的每一个组件当作一个卡片,一次仅有一个卡片可见,最初显示容器时,加入到容器的第一个组件可见。eg

public class CardLayoutF2
{
Frame f = new Frame("测试窗口");
String[] names = {"第一张" , "第二张" , "第三张" , "第四张" , "第五张"};
Panel pl = new Panel();
CardLayout c = new CardLayout();
public void init()
{
pl.setLayout(c);
for (int i = 0 ; i < names.length ; i++)
{
pl.add(names[i] , new Button(names[i]));
}
Panel p = new Panel();
//控制显示上一张的按钮
Button previous = new Button("上一张");
previous.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
c.previous(pl);
}
});
//控制显示下一张的按钮
Button next = new Button("下一张");
next.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
c.next(pl);
}
});
//控制显示第一张的按钮
Button first = new Button("第一张");
first.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
c.first(pl);
}
});
//控制显示最后一张的按钮
Button last = new Button("最后一张");
last.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
c.last(pl);
}
});
//控制根据Card名显示的按钮
Button third = new Button("第三张");
third.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
c.show(pl , "第三张");
}
});
p.add(previous);
p.add(next);
p.add(first);
p.add(last);
p.add(third);
f.add(pl);
f.add(p , BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new CardLayoutF2().init();
}
}

  

4.网格布局(GridLayout)将容器划分为n*m的大小相同的小格,每格区间可摆放一个组件。向容器中增加组件时,按从左至右,从上至下的顺序依次存放.eg

GridLayout() 将组件从左到右排列在容器中,只排列一行。

GridLayout(int rows,int cols) 指定行列为rows行,cols列

GridLayout(int rows,int cols,int hgap,int vgap) 指定行列为rows行,cols列,组件间距10像素

public class GridLayoutFrame {

	public static void main(String[] args) {
Frame frame = new Frame("网格布局管理器");
frame.setLayout(new GridLayout(3,5,10,10));//3行5列,间距10,10 for(int i = 0 ; i <=9 ; i ++){
frame.add(new Button(Integer.toString(i)));
} frame.setSize(300,300);
frame.setVisible(true); frame.addWindowListener(new cls());
} }

5.网格包布局(GridBagLayout)这个功能最强大,但用起来太麻烦了。将视图分为多个单元,可以指定每个组件占用的单元。以GridLayout为基础,在容器中以网格形式管理组件。区别:

(1) GridBagLayout布局的组件可以占据多个单元格,可以在容器中占据任意大小的矩形区域,GridLayout把每个组件限制到一个单元格。

(2) GridBagLayout布局使得不同的行列比例不必相等,组件可以保留原来的大小。

(3) GridBagLayout布局使得单元格中的组件可以不同方式排列

要使用GridBagLayout和GridBagConstraints类。

GridBagLayout是类的布局管理器,GridBagConstraints是其辅助类,用来定义添加到容器中组件的各种属性,如大小、位置、边框。

GridBagConstraints类如下public成员变量用来控制和操纵组件在容器中的排列

(1) int anchor :该变量设置布局管理器组件在表格空间中的位置

(2) int fill : 如果显示区域比组件区域大,该变量可以用来控制组件的行为。控制组件是垂直填充,还是水平填充,或者两个方向都填充。

(3) int gridx : 表示组件的横向坐标,以网格的行数为单位。

(4) int gridy : 表示组件的纵向坐标,以网格的列数为单位。

例子:

GridBagConstraints gbs = new GridBagConstraints()
gbc.gridx = 0;
gbc.gridy = 0;

(5) gridWidth :表示组件的横向宽度,即指组件占用的列数,类似于HTML的colspan标记

(6) gridheight : 表示组件的纵向长度. 下面语句设置组件占用宽度为1列,高度为2行的单元格

GridBagConstraints gbs = new GridBagConstraints()
gbc.gridwidth = 1;
gbc.gridheight = 2;

(7) Insets Insets :该变量指组件与表格空间四周边缘的空白区域大小。

(8) int ipadx :该变量表示组件间的横向间距,组件的宽度就是这个组件的最小宽度加上ipadx值.

(9) int ipady :该变量表示组件间的纵向间距,组件的高度就是这个组件的最小高度加上ipady值.

(10) double weightx : 该变量为行的权重,指示布局管理器如何分配额外的水平空间。

(11) double weighty : 该变量为列的权重,指示布局管理器如何分配额外的垂直空间。

创建GridBagLayout布局容器的一般步骤

(1)创建网格袋布局管理器

  Frame frame = new Frame("网格袋布局");

  frame.setLayout(new GridBagLayout());

(2)创建GridBagConstraints

  GridBagConstraints gbc = new GridBagConstraints ();

(3)创建组件并设置GridBagConstraints

  Button a = new Button("a");

  gbc.gridx = 0 ;

  gbc.gridy = 0 ;

  gbc.gridwidth = 1 ;

  gbc.gridheight = 1 ;  

(4)添加组件

  frame.add(a,gbc);

(5)显示窗体

  frame.setSize(200,200);

  frame.setVisible(true);

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) {
new TestGridBag().init();
}
}

  

参考:

http://blog.163.com/fengg_5241/blog/static/113243266200961792339279/

http://blog.csdn.net/terryzero/article/details/3742467

http://www.iteye.com/problems/29841

Java学习笔记--Java图形用户界面的更多相关文章

  1. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  2. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  3. Java学习笔记--Swing2D图形

    1.处理2D图形 要想使用java 2D库绘制图形,需要获得一个Graphics2D类对象.这个类是Graphics类的子类.paintComponent方法自动获得一个Graphics2D类对象,我 ...

  4. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

  5. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

  6. 我的Java学习笔记-Java面向对象

    今天来学习Java的面向对象特性,由于与C#的面向对象类似,不需详细学习 一.Java继承 继承可以使用 extends 和 implements 这两个关键字来实现继承. extends:类的继承是 ...

  7. java学习笔记----java入门

    java基础 一.java语言跨平台原理 1.什么是跨平台? 跨平台就是一个软件可以在不同的操作系统中运行,但是不需要对其修改.换句话说,java语言编写的软件在不做修改的情况下就能在不同的系统平台上 ...

  8. Java学习笔记-Java概述和环境配置

    基础常识 软件:一系列按照特定顺序组织的计算机数据 和指令的集合 常见的软件: 系统软件:如:DOS,windows,Linux等 应用软件:如:扫雷,迅雷,QQ等 软件的出现实现了人与计算机之间的更 ...

  9. Java学习笔记-Java中的常用类

    Java中有很多类是很常用的,此处列举System,Runtime,Date,Calendar,Math System System:类中的方法和属性都是静态的 字段摘要 static PrintSt ...

随机推荐

  1. QT下资源使用和资源占用…(可以动态加载资源文件,这样不占内存)

    原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想     最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. h ...

  2. 超全超详细的HTTP状态码大全(推荐抓包工具HTTP Analyzer V6.5.3)

    超全超详细的HTTP状态码大全 本部分余下的内容会详细地介绍 HTTP 1.1中的状态码.这些状态码被分为五大类: 100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功. ...

  3. [转]RegOpenKeyEx函数失败的问题

    在使用这个函数RegOpenKeyEx的时候,老是执行不成功,函数本身返回2,GetLastError返回0.在CSDN上查阅资料说是返回2的原因是注册表中对应路径不存在,可是我电脑中注册表那个键值明 ...

  4. Could not find *.apk!解决办法

    右键点击项目选择Properties,把Libraries下Android x.x给remove了. 点右侧的Add Library,选择JRE System Library然后next,重新指定JR ...

  5. sql server Convert 的函数的用法 转换成浮点数

    SELECT a.ijjdid ,b.ICYDID 订单ID,b.CCYDH 订单编号,b.CWYDH 委印单号,b.CYJMC 印件名称,b.CYJLX 印件类型,b.CYWDWMC 客户名称,b. ...

  6. j2ee开源项目——IT学习者博客(itxxzblog v1.0)

    大家好,我是IT学习者-螃蟹,已经有近一周的时间没有更新文章了,作为回报,今天起将更新一个大件,也就是螃蟹还在进行中的IT学习者博客. IT学习者博客的初期设计已经完成,功能也已经完成了大半,具备了当 ...

  7. Abstract Methods and Classes

    阅读了Java的官方Doc,在此总结如下. Abstract Class & Method In jave, "abstract" can be a modifier to ...

  8. vim编辑器的设置文件

    vim配置特点: 1.按F5可以直接编译并执行C.C++.java代码以及执行shell脚本,按“F8”可进行C.C++代码的调试 2.自动插入文件头 ,新建C.C++源文件时自动插入表头:包括文件名 ...

  9. openStack kilo 手动Manual部署随笔记录

    一 ,基于neutron网络资源主机(控制节点,网络节点,计算节点)网络规划配置 1, controller.cc 节点 网络配置截图

  10. bootstrap学习以及其插件

    Bootstrap中文网地址,里面有bootstrap组件的下载与使用说明,现在使用bootstrap3: http://www.bootcss.com/ W3CSchool.CC里面有学习boots ...