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.awtjavax.swing的类层次关系

l         熟练掌握java.awt包中常用的组件

l         熟练掌握常用的布局方式:FlowLayoutGirdLayoutBorderLayoutCardLayoutGirdBagLayout,手工布局

l         通过对java.awt包中容器和组件的理解去理解javax.Swing包中的组件

l         区分java.awtjavax.Swing的组件

相关知识

l         了解图形用户介面

l         Applet的生命周期

l         了解轻量级组件和重组件

学习重点

l         撑握常用组件的实现

l         能熟练的用抽象窗口工具箱编写applet程序

l         灵活运用FlowLayoutGirdLayoutBorderLayoutCardLayoutGirdBagLayout和手工布局的布局方式

内容框架(见下载文档)

在讲解这章的时候,首先向大家介绍一下什么是图形用户界面。形用户界面Graphics User Interface),简称GUI,使用图形的方式,借助按钮、菜单等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。图形用户界面画面生动、操作简单,省去了字符界面用户必须记忆各种命令的麻烦,深受广大用户喜爱和欢迎,已经成为目前几乎所有应用软件的既成标准。

Java的可视化(俗称图形用户介面GUI)编程是在它的抽象窗口工具箱(Abstract Window ToolkitAWT)上实现的。AWT包括了丰富的图形、用户界面元件和对布局管理器的支持

本章将主要介java的可视化编程所需要的java基本可视化组件,以及在可视接口中要用的接口布局和高级java组件。可视化编程主要用应用在Application Applet程序中

8.1Awt组件和Swing组件

Java AWT(Abstract Windowing Toolkit)包含两组组件,第一组就是java 1.0java 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,可以指定程序中GUIlook 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.Buttonjava.awt.Labeljava.awt.CheckBoxjava.awt.Choicejava.awt.Colorjava.awt.Pointjava.awt.TextFieldjava.awt.TextAreajava.awt.Containerjava.awt.Bialogjava.awt.Dimensionjava.awt.Graphicsjava.awt.Listjava.awt.BorderLayotjava.awt.CardLayout java.awt.Imagejava.awt.Frame等。而javax.swing包中的组件内容一般都是和java.awt包中的内容相对应的,其中他们的命名方式也是与之对应的,只是在AWT组件的名称前多了一个字母J,例如: JButtonJPanelJCheckBoxJLableJTextFieldJDialogJFrameJWindow JComponent、等,另外Swing组件还有很多AWT组件所没有的项,例如:JSliderJProgressBarJTreeJRadioButtonJTable等。而且这些组件大部分都是继承javax.swing.Jcomponent类的,而javax.swing.Jcomponent类是继承了java.awt.Container类,所以Swing组合件的内容比AWT组件的内容更丰富也更高级。(包的祥细情况见javaAPI包)

8.1.3类层次

(见下载文档)

8-1 类层次

8.2 基本JAVA组件

基本java组件是构成图形用户介面必不可少的,它是构成GUI的基本要素,通过对不同事件的响应来完成和用户的交互或组件之间的交互,组件一般作为一个对象放置在容器内,容器是能容纳和排列组件的对象,如appletpanelframe等,组件通过容器的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的生命周期分为四个阶段,各阶段分别由initstartstopdestroy四种方法来具体体现,如下图所示。这些方法都是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停止执行,当含有该AppletWeb页被其他页代替时调用该方法,也正是在Applet被消灭之前。在Applet的子类中重载该方法,将每次Web页不再可见时需执行的操作放入其中

4   public void destroy()

此方法通知Applet,它正在被收回,应该释放已分配给它的所有资源,stop方法总是在该方法调用之前被调用

运行结果如图8-3所示

(见下载文档)

8-3 按钮

【注意】在例8-2中,button是作为主类的一个对象成员创建的,因此,主类的所有方法都可以使用;

如果要使用Applet小程序,那么你必须得用extends关键字来继承Applet,eclipse环境中,可以直接运行Applet小程序,而在其它工具里就未必了。

Applet类中没有提供initstartstopdestroy方法的任何实现(implementation),并且,它们都是被浏览器或Applet查看器(例如:appletviewer)调用。

8.2.2标签

Label 对象是一个可在容器中放置文本的组件。一个标签只显示一行只读文本。文本可由应用程序更改,但是用户不能直接对其进行编辑。所属awt包中,它所实现的接口有:ImageObserver, MenuContainer, Serializable, Accessible

()标签的构造方法

     Label() 构造一个空标签

     Label(String text)使用指定的文本字符串构造一个新的标签,其文本对齐方式为左对齐

     Label(String text, int alignment) 构造一个显示指定的文本字符串的新标签,其文本对齐方式为指定的方式

【注】:Label3种对齐方式,分别用Label类的3个常量LEFT(指示标签文本左对齐)CENTER(指示标签文本居中对齐)REGHT(指示标签文本应右对齐)

()标签的常用方法

       Label3种对齐方式,分别用Label类的3个常量LEFT(指示标签文本左对齐)CENTER(指示标签文本居中对齐)REGHT(指示标签文本应右对齐)

       Public String getText() 获取此标签的文本, 如果此文本已设置为 null,则返回 null

       Public void setAlignment(int alignment) 将此标签的对齐方式设置为指定的方式, 可能的值有 Label.LEFTLabel.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) 使用指定标签创建一个复选框,并将它设置为指定状态

【注】状态有两种:trueflasetrue代表你你选中了那项,反之没有选中

     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.Listjava.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 文本框

【注意】参数中的列是近似平均字符宽度,它与平台有关(未完)