第8章 可视化编程(一) 2
总体概要... 2
相关知识... 2
学习重点... 2
内容框架... 3
8.1Awt组件和Swing组件... 3
8.1.1Awt组件与Swing组件的区别... 3
8.1.2Java.awt包和javax.swing包... 4
8.1.3类层次... 4
8.2 基本JAVA组件... 5
8.2.1按钮... 5
(一)按钮的构造方法... 5
(二)按钮的常用方法... 5
(三)创建按扭... 5
8.2.2标签... 7
(一)标签的构造方法... 7
(二)标签的常用方法... 7
(二)创建标签... 8
8.2.3选项框... 9
(一)选项框的构造方法... 9
(二)选项框的常用方法... 9
(三)创建选项框... 9
8.2.4复选框和选项按钮... 10
(一)复选框和单选框的构造方法... 11
(二)复选按钮和单选按钮的常用方法... 11
(三)创建复选框和单选框... 11
8.2.6列表框... 13
(一)列表框的构造方法... 13
(二)列表框的常用方法... 13
(三)创建列表框... 14
8.2.7文本框... 15
(一 )文本框的构造方法... 15
(二)文本框的常用方法... 15
(三)创建文本框... 15
第8章 可视化编程(一)
l 知道可视化编程(图形用户介面)
l 了解awt组件与swing组件的异同
l 理解与掌握可视化编程主要用的两个地方:application,Applet
l 理解与掌握java.awt包和javax.swing包实现可视化编程
l 理解java.awt和javax.swing的类层次关系
l 熟练掌握java.awt包中常用的组件
l 熟练掌握常用的布局方式:FlowLayout,GirdLayout,BorderLayout,CardLayout,GirdBagLayout,手工布局
l 通过对java.awt包中容器和组件的理解去理解javax.Swing包中的组件
l 区分java.awt和javax.Swing的组件
l 了解图形用户介面
l Applet的生命周期
l 了解轻量级组件和重组件
l 撑握常用组件的实现
l 能熟练的用抽象窗口工具箱编写applet程序
l 灵活运用FlowLayout,GirdLayout,BorderLayout,CardLayout,GirdBagLayout和手工布局的布局方式
在讲解这章的时候,首先向大家介绍一下什么是图形用户界面。形用户界面(Graphics User Interface),简称GUI,使用图形的方式,借助按钮、菜单等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。图形用户界面画面生动、操作简单,省去了字符界面用户必须记忆各种命令的麻烦,深受广大用户喜爱和欢迎,已经成为目前几乎所有应用软件的既成标准。
而Java的可视化(俗称图形用户介面GUI)编程是在它的抽象窗口工具箱(Abstract Window Toolkit,AWT)上实现的。AWT包括了丰富的图形、用户界面元件和对布局管理器的支持
本章将主要介java的可视化编程所需要的java基本可视化组件,以及在可视接口中要用的接口布局和高级java组件。可视化编程主要用应用在Application和 Applet程序中
8.1Awt组件和Swing组件
Java AWT(Abstract Windowing Toolkit)包含两组组件,第一组就是java 1.0和java 1.1提供的简单组件Awt,这些组件一般都在java.awt包中,第二组就是java 1.2所带的swing组件,随着时间的推移,它的内容还会不断的发展,而且还提供了更多复杂组件,便用Swing组件来开发GUI已成为一种发展趋势,但请读者不要认为swing组件就是awt组件的替代品,可以说是awt组件是Swing组件的基础,Swing组件都有针对Awt组件的一套组件。也可以从另一方面看出,javax.swing.*中大部分class都是从java.awt. Container中继承而来,所以只有把awt组件学好,那么您才能用swing 组件编写出更复杂和更美观的图形用户介面。
总之,只有熟练使用java.awt包和javax.swing包中的组件才可以编制出具有良好的视觉效果,以及操作效果的图形化接。
8.1.1Awt组件与Swing组件的区别
对于学习这一章的时候,很多的读都有一个很头痛的问题,那就是awt组件和Swing组件都是做图形用户介面的,那么他们到底有什么区别呢?所以跟据这一个原因,在下面我向大家介绍一下Awt组件和Swing组件的区别与联系。
区别:
Swing组件与AWT组件的最大不同是:Swing组件完全由java语言实现,工能更强大,而AWT不是。
① Swing组件提供了AWT组件无法实现的功能如下:
② Swing 的按钮和标签可以显示图像,而在Awt只能显示文本
③ 可以很容易地增加或改变大多数Swing组件的边界
④ 通过调用Swing组件上的方法或创建一个子类,可以很容易地改Swing组件的行为外观。
⑤ Swing组件可以不是矩形,例如:按钮可以是椭圆形。
⑥ Accessibility技术(例如触摸屏)可以很容易地从swing组件得到信息。
在swing,可以指定程序中GUI的look and feel,真正做到GUI与平台无关,但在AWT中则不行。
Swing主要是一些轻量级组件,而awt的重组件较多
联系:
Javax.swing*绝大部分class都从java.awt.Container中继承
8.1.2Java.awt包和javax.swing包
Java.awt包和javax.swing包都是对java组件的摡括,所以它们包中的内容也主要包括一些关于组件的接口、类、异常和错误。
Java.awt包中常用的类,即组件有java.awt.Button、java.awt.Label、java.awt.CheckBox、java.awt.Choice、java.awt.Color、java.awt.Point、java.awt.TextField、java.awt.TextArea、java.awt.Container、java.awt.Bialog、java.awt.Dimension、java.awt.Graphics、java.awt.List、java.awt.BorderLayot、java.awt.CardLayout 、java.awt.Image、java.awt.Frame等。而javax.swing包中的组件内容一般都是和java.awt包中的内容相对应的,其中他们的命名方式也是与之对应的,只是在AWT组件的名称前多了一个字母J,例如: JButton、JPanel、JCheckBox、JLable、JTextField、JDialog、JFrame、JWindow JComponent、等,另外Swing组件还有很多AWT组件所没有的项,例如:JSlider、JProgressBar、JTree、JRadioButton、JTable等。而且这些组件大部分都是继承javax.swing.Jcomponent类的,而javax.swing.Jcomponent类是继承了java.awt.Container类,所以Swing组合件的内容比AWT组件的内容更丰富也更高级。(包的祥细情况见java的API包)
8.1.3类层次
(见下载文档)
图8-1 类层次
8.2 基本JAVA组件
基本java组件是构成图形用户介面必不可少的,它是构成GUI的基本要素,通过对不同事件的响应来完成和用户的交互或组件之间的交互,组件一般作为一个对象放置在容器内,容器是能容纳和排列组件的对象,如applet、panel、frame等,组件通过容器的add方法加入到容器中
8.2.1按钮
Java提供了标准按扭(Button),可带有文字标题,java.awt.Button是从java.awt.Component中继承而来,它所有已实现的接口有:ImageObserver, MenuContainer, Serializable, Accessible
(一)按钮的构造方法
① Button()构造一个标签字符串为空的按钮
② Button(String label)构造一个带指定标签的按钮
(二)按钮的常用方法
③ Public String getActionCommand()返回此按钮激发的操作事件的命令名称, 如果命令名称为 null(默认),则此方法返回按钮的标签
④ Public String getLabel() 获得此按钮的标签, 如果按钮没有标签,则返回 null
⑤ Public void setActionCommand(String command) 设置此按钮激发的操作事件的命令名称, 在默认情况下,此动作命令设置为与按钮标签相匹配, 如果字符串为 null,则动作命令设置为与按钮标签相匹配
⑥ Public void setLabel(String label)将按钮的标签设置为指定的字符串, ,如果按钮没有标签,则为 null
(三)创建按扭
【例8.1】创建一个按钮,程序名为ButtonTest.,代码如下所示:
package bedeck;
import java.awt.*;
import java.applet.*;
/*
* 创建按钮
* */
public class ButtonTestextends Applet{ //继承了Applet类
Button button1 = new Button("标签"); //创建一个带指定"标签"的按钮。
Button button2 = new Button(); //构造一个标签字符串为空的按钮。
/*
* 对applet程序进行初始化
* */
public void init(){
this.add(button1); //把按钮button1添加到默认的applet窗口中
this.add(button2); //把按钮button1添加到默认的applet窗口中
}
}
|
说明:该程序首先定义了一个公共类ButtonTest,因此此程序的文件名为ButtonTest.java,为了使组件能显示在图形介面上,所以该程序继承了Applet类,下面对Applet的生命周期进行讲解
Applet的生命周期分为四个阶段,各阶段分别由init,start,stop和destroy四种方法来具体体现,如下图所示。这些方法都是Applet类的成员,可以继承这些方法,也可以重写这些 程序,覆盖原来定义的这些方法 ,如8-2所示:
(见下载文档)
图8-2 Applet的生命周期
1 public void init()
此方法通知Applet,方法已经被装入系统,在第一次调用start方法之前总是先调用它。Init方法是Applet运行的起点。如果需要执行初始化任务,可以在Applet的子类中重载该方法,例如,在init方法中创建线程,而在destroy方法中消灭(destroy)它们
2 public void start()
此方法通知Applet开始执行,当调用init方法或者在Web页中再次访问时被调用。在Applet的子类中重载该方法,将每次访问该WWW页需执行的操作放入其中,例如,一个含自动画的Applet可以使用start方法恢复动画
3 public void stop()
此方法通知Applet停止执行,当含有该Applet的Web页被其他页代替时调用该方法,也正是在Applet被消灭之前。在Applet的子类中重载该方法,将每次Web页不再可见时需执行的操作放入其中
4 public void destroy()
此方法通知Applet,它正在被收回,应该释放已分配给它的所有资源,stop方法总是在该方法调用之前被调用
运行结果如图8-3所示
(见下载文档)
8-3 按钮
【注意】在例8-2中,button是作为主类的一个对象成员创建的,因此,主类的所有方法都可以使用;
如果要使用Applet小程序,那么你必须得用extends关键字来继承Applet类,在eclipse环境中,可以直接运行Applet小程序,而在其它工具里就未必了。
Applet类中没有提供init,start,stop和destroy方法的任何实现(implementation),并且,它们都是被浏览器或Applet查看器(例如:appletviewer)调用。
8.2.2标签
Label 对象是一个可在容器中放置文本的组件。一个标签只显示一行只读文本。文本可由应用程序更改,但是用户不能直接对其进行编辑。所属awt包中,它所实现的接口有:ImageObserver, MenuContainer, Serializable, Accessible
(一)标签的构造方法
⑦ Label() 构造一个空标签
⑧ Label(String text)使用指定的文本字符串构造一个新的标签,其文本对齐方式为左对齐
⑨ Label(String text, int alignment) 构造一个显示指定的文本字符串的新标签,其文本对齐方式为指定的方式
【注】:Label有3种对齐方式,分别用Label类的3个常量LEFT(指示标签文本左对齐)、CENTER(指示标签文本居中对齐)、REGHT(指示标签文本应右对齐)
(二)标签的常用方法
① Label有3种对齐方式,分别用Label类的3个常量LEFT(指示标签文本左对齐)、CENTER(指示标签文本居中对齐)、REGHT(指示标签文本应右对齐)
② Public String getText() 获取此标签的文本, 如果此文本已设置为 null,则返回 null
③ Public void setAlignment(int alignment) 将此标签的对齐方式设置为指定的方式, 可能的值有 Label.LEFT、Label.RIGHT 和 Label.CENTER
④ Public setText(String text) 将此标签的文本设置为指定的文本, 如果 text 为 null,则将其作为一个空字符串 "" 显示
(二)创建标签
【例8.2】在窗口中添加三个标签,分别说明这个标签的功能,文件名为LabelTest.java,程序代码如下:
package test;
import java.awt.*;
import java.applet.*;
/*
* 创建标签
* */
public class LabelTest extends Applet{
Label label1 = new Label(); //构造一个空标签
Label label2 = new Label("文本内容"); //使用指定的"文本内容"串构造一个新的标签
Label label3 = new Label("文本内容",Label.RIGHT); //使用指定的"文本内容"串构造一个新的标签,设置的对齐方式为右对齐
/*
* 对applet程序进行初始化
* */
public void init(){
this.add(label1); //把按钮label1添加到默认的applet窗口中
this.add(label2); //把按钮label2添加到默认的applet窗口中
this.add(label3); //把按钮label3添加到默认的applet窗口中
}
}
|
说明:该程序定义了一个公共类,名称为LabelTest,因为保存的文件名为LabelTest.java,本程序同样继承了Applet类,其基本结构相同,在此不再熬述
运行结果如8-4所示:
(见下载文档)
8-4 标签
【注意】从窗口的表面来看只有两个标签,其实是三个标签,原因很简单,那就是有一个空标签,因为空标签中没有任何内容,如果你想看出什么效果,那么你就对标签设置相应的属性
8.2.3选项框
选项框又称下拉式列表,它表示一个弹出式选择菜单,这种选项框一次只能显示一个选项,要改变被选 中的选 项,可以单击下拉箭头,从选项框中选择一个选项
(一)选项框的构造方法
Choice() 创建一个新的选择菜单, 最初,此菜单中没有任何项,在默认情况下,在用户通过调用 select 方法之一进行不同的选择之前,给选择菜单添加的第一个项将成为选定项: Choice choice = new Choice()
(二)选项框的常用方法
① Public void add(String item)将一个项添加到此 Choice菜单中
② Public int getItemCount()返回此 Choice 菜单中项的数量
③ Public void insert(String item, int index) 将菜单项插入此选择的指定位置上, 如果某个索引上存在的项大于或等于 index,则将它上移一位,以容纳新的项。如果 index 大于或等于此选择中项的数目,则将 item 添加到此选择的结尾处。如果此项是第一个添加到该选择中的项,则这个项将成为选定项。否则,如果选定项是上移项中的一个,则该选择中的第一个项将成为选定项。如果选定项不在这些上移项中,则它仍然是选定项
④ Public voi remove(int position)从选择菜单的指定位置上移除一个, 。如果正被移除的项是目前选定的项,则该选择中的第一个项将成为选定项。否则,当前选定项将仍然是选定项(并且选定的索引相应地更新)
⑤ Public void removeAll() 从选择菜单中移除所有的项
⑥ Public void select(int pos) 将此 Choice 菜单中的选定项设置为指定位置上的项
【注意】,此方法主要应该用于初始化对此组件中某个项的选择。以编程方式调用此方法不 会触发 ItemEvent。触发 ItemEvent 的惟一方式是通过用户交互
⑦ Public void select(String str) 将此 Choice 菜单中的选定项设置为其名称等于指定字符串的项。如果有多个项与指定的字符串匹配(相等)
【注意】此方法主要应该用于初始化对此组件中某个项的选择。以编程方式调用此方法不 会触发 ItemEvent。触发 ItemEvent 的惟一方式是通过用户交互
(三)创建选项框
【例8.3】创建选项框,类的名称为ChoiceTest.java,代码如下所示:
package bedeck;
import java.awt.*;
import java.applet.*;
public class ChoiceTest extends Applet {
/*
* 构造方法
* */
public ChoiceTest(){}
/*
* 创建选项框
*/
Label label = new Label("这是个选项框: "); //使用"这是个选项框:"字符串构造一个标签
Choice choice = new Choice(); // 创建一个新的选择菜单
/*
* 对applet程序进行初始化
* */
public void init(){
/*
* 向choice中添加选项内容
* */
choice.addItem("选项一");
choice.add("选项二");
choice.insert("选项三", 1); //注:choice.insert(String item, int index)中的,index的索引位置是从0开始.
this.add(label); //把按钮label添加到默认的applet窗口中
this.add(choice); //把按钮choice添加到默认的applet窗口中
}
}
|
|
说明:程序中choice.addItem(“选项一”); choice.add(“选项二”); choice.insert(“选项三”,1)可以把它写在this.add(choice)后面,其运行结果是一样。
程序中choice.addIem(String item)方法已在Java 2 platform v1.1 已过时,一般都使用 add 方法替换。
运行结果如8-5所示
(见下载文档)
8.5选项框
8.2.4复选框和选项按钮
复选框(Checkbox) 是一个可处于“开”或“关”状态的图形组件,能使用户作出多项选择,比如一个人的兴趣爱好,他喜欢足球,也喜欢篮球,还喜欢其它的运动,在这样的情况下都会用到Checkbox。而与之想对应的就是选项按钮(CheckboxGroup),通常称为单选框, CheckboxGroup类是将一些复选框组成一组,作为单个对象来控制。在一个复选框组中,在任何给定时间,最多只能有一个按钮处于“开”状态。单击并打开一个复选框,这会强迫同组的其他原来处于打开状态的复选框变为“关”状态
(一)复选框和单选框的构造方法
复选框:
① Checkbox() 使用空字符串标签创建一个复选框, 此复选框的状态被设置为“关”,并且它不属于任何复选框组
② Checkbox(String label) 使用指定标签创建一个复选框,并将它设置为指定状态。该复选框不属于任何复选框组
③ Checkbox(String label, boolean state) 使用指定标签创建一个复选框,并将它设置为指定状态
【注】状态有两种:true、flase,true代表你你选中了那项,反之没有选中
① Checkbox(String label, boolean state, CheckboxGroup group)使用指定标签构造一个 Checkbox,并将它设置为指定状态,使它处于指定复选框组中
② Checkbox(String label, CheckboxGroup group, boolean state)使用指定标签创建一个 Checkbox,并使它处于指定复选框组内,将它设置为指定状态
单选按钮
CheckboxGroup() 创建 CheckboxGroup 的一个新实例
(二)复选按钮和单选按钮的常用方法
复选按钮
① Public String getLabel() 获得此复选框的标签。
② Public boolean getState() 确定此复选框是处于“开”状态,还是处于“关”状态,布尔值 true 指示此复选框处于“开”状态,false 指示此复选框处于“关”状态
③ Public void setLabel(String label)将此复选框的标签设置为字符串参数
④ Public void setState(boolean state) 将此复选框的状态设置为指定状态, 布尔值 true 指示此复选框处于“开”状态,false 指示此复选框处于“关”状态
【注意】此方法应主要用于初始化复选框的状态。以编程方式设置复选框的状态,这不会触发 ItemEvent。触发 ItemEvent 的惟一方式是用户交互
单选按钮
① Public Checkbox getSelectedCheckbox()从此复选框组中获得当前选择
② Public String toString()返回此复选框组的字符串表示形式,包含当前选中复选框的值
(三)创建复选框和单选框
【例8.4】在默认的applet窗口中添回两个标签,四个复选框,四个单选框,程序名为CKTest.java,代码如下所示:
package bedeck;
import java.awt.*;
import java.applet.*;
public class CKTest extends Applet{
/*
* 创建复选框和单选框
* */
Label label1 = new Label("复选框例:"); //创建两个带字符串的标签
Label label2 = new Label("单选框例:");
Checkbox ckb1 = new Checkbox(); //创建一个空字符串的复选框
Checkbox ckb2 = new Checkbox("复选框一"); //创建两个带字符串的复选框
Checkbox ckb3 = new Checkbox("复选框二");
Checkbox ckb4 = new Checkbox("复选框三",true); //创建一个被选中且有字符串的复选框
Checkbox ckb5 = new Checkbox("复选框四",false); //创建一个未选中且有字符串的复选框
CheckboxGroup ckbg = new CheckboxGroup(); //创建CheckboxGroup 的一个新实例
public void init(){
/*
* 把组件添加到applet默认的窗口中
* */
this.add(label1);
this.add(ckb1);
this.add(ckb3);
this.add(ckb4);
this.add(ckb5);
this.add(label2);
/*
* 把CheckboxGroup的实例添到一组checkbox中,并把添加到applet默认的窗口中去
* */
this.add(new Checkbox("单选框一", ckbg, true));
this.add(new Checkbox("单选框二", ckbg, false));
this.add(new Checkbox("单选框三", ckbg, false));
}
}
|
说明:复选框和选项按钮的主要区别是一个可以选取多项,另一个只能选取一个。
运行结果如图8-6所示
(见下载文档)
8-6复选框和选项按钮
【注意:】单选框是的实现的,以及与复选框的联系
8.2.6列表框
List 组件为用户提供了一个可滚动的文本项列表,基中列表框的所有选项都是可见的(当选项数目超出了列表框可见区的范围,则列表框自动出现滚动条)。可以让用户进行单项或多项选择
(一)列表框的构造方法
③ List()创建新的滚动列表。默认情况下,有四个可视行,并且不允许多项选择。注意,这是 List(0, false) 的一种便捷方法
④ List(int rows) 创建一个用指定可视行数初始化的新滚动列表。默认情况下,不允许多项选择。注意,这是 List(rows, false) 的一种便捷方法
⑤ List(int rows,boolean multipleMode) 创建一个初始化为显示指定行数的新滚动列表。注意,如果指定了零行,则会按默认的四行创建列表。还要注意,列表中的可视行数一旦创建就不能更改。如果 multipleMode 的值为 true,则用户可从列表中选择多项。如果为 false,则一次只能选择一项
(二)列表框的常用方法
① Public void add(String item)向滚动列表的末尾添加指定的项
② Public void add(String item, int index)向滚动列表中索引指示的位置添加指定的项
③ Public String getItem(int index) 获取与指定索引关联的项
④ Public int getItemCount()获取列表中的项数
⑤ Public int getRows()获取此列表中的可视行数
⑥ Public void remove(int position)从此滚动列表中移除指定位置处的
⑦ Public void removeAll() 从此列表中移除所有项
(三)创建列表框
【例8.5】创建两个列表框,程序名为:ListText.java,代码如下所示。
package bedeck;
import java.awt.*;
import java.applet.*;
public class ListTest extends Applet{
/*
* 对List进行实例化
* */
List list1 = new List();
List list2 = new List(5,true); //数字5表示列表框中所看到的行数,参数true表示可以进行多项选择
Label label = new Label("列表框例子:");
public void init(){
/*
* 把组件添加到默认applet窗口
* */
list1.add("列表一");
list1.add("列表二");
list1.add("列表三");
this.add(label);
this.add(list1);
list2.add("列表一");
list2.add("列表二");
list2.add("列表三");
list2.add("列表四");
list2.add("列表五");
list2.add("列表六");
this.add(list2);
}
}
|
说明:程序中List list2 = new List(5,true);如果可视行数超过5,那么列表框中自动出现滚动条,若把参数true改为false,那么这语句可以用List list = new List(5)代替。
运行结果如8-7所示:
(见下载文档)
8-7 列表框
【注意】列表中的可视行数一旦创建就不能更改;请读者不要把列表框java.awt.List和java.util.List搞混淆了,虽然他们都是相同的名字,但他们的应用范围缺没有任何联系,java.util.List的详细内容见系统类这一章
8.2.7文本框
TextField 对象是允许编辑单行文本的文本组件,每次用户在文本字段中键入一个键,就有一个或更多键事件被发送到该文本字段,他显示为一行
(一 )文本框的构造方法
① TextField()构造新文本字段
② TexField(int columns)构造具有指定列数的新的空文本字段
③ TextField(String text)构造一个带有初始文本内容的文本框
④ TextField(String text, int columns)构造使用要显示的指定文本初始化的新文本字段,并指定了长度的文本框
(二)文本框的常用方法
① Public int getColumns()获取此文本字段中的列数
② Public void setColumns(int columns)设置此文本字段中的列数
③ Public void setEchoChar(char c)设置此文本字段的回送字符
④ Public char getEchoChar()获取用于回送的字符
⑤ Public void setText(String t)将此文本组件显示的文本设置为指定文本
(三)创建文本框
【8.6】创建文本框,文件名称为:TFTest.java,代码如下所示
package bedeck;
import java.awt.*;
import java.applet.*;
public class TFTest extends Applet{
Label label1 = new Label("文本实例1:");
Label Label2 = new Label("文本实例2:");
Label label3 = new Label("文本实例3:");
TextField tf1 = new TextField(10);
TextField tf2 = new TextField("初始化文本框");
TextField tf3 = new TextField("初始化文本框的内容",10); //构造一个长度为10且有初始化文本的内容
public void init(){
/*
* 把组件添加到applet默认的窗口中
* */
tf1.setEchoChar('*'); //设置文本的显示内容为"*"
this.add(label1);
this.add(tf1);
this.add(Label2);
this.add(tf2);
this.add(label3);
this.add(tf3);
}
}
|
说明:setEchoChar(‘*’)方法非常有用,它重要用途是设置密码的显示方式,参数’*’可以跟据您的爱好进行设置比如说,@, !, $, %等。
运行结果所8-8所示
(见下载文档)
8-8 文本框
【注意】参数中的列是近似平均字符宽度,它与平台有关(未完)