第9章 编写图形用户界面 Flashcards

1
Q

编写图形用户界面概述

A

Java编程语言是一种跨平台的编程语言,在编写图形用户界面方面,也要支持跨平台功能。Java图形用户界面技术经历了两个发展阶段,分别通过提供AWT开发包和Swing开发包来体现,而且功能越来越强大,界面设计越来越美观。
Java图形用户界面的编写普遍采用构件的思想来进行。在进行界面设计的时候,只要掌握好AWT和Swing的三点思路,就能编写出较好的图形用户界面:首先是界面中的构件如何放置,其次是如何让构件响应用户的操作,第三是掌握每种构件的显示效果和响应用户操作。

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

用AWT编写图形用户界面

A

抽象窗口工具包AWT(Abstract Window Toolkit)是Java提供的建立图形用户界面GUI(Graphics User Interface)的开发包,AWT可用于Java的Applet和Application中,它支持图形用户界面编程的主要功能包括:用户界面构件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可能进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辩率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。
1、java.awt包
java.awt包中提供了GUI设计所使用的类和接口。java.awt包提供了基本的java程序的GUI设计工具。主要包括下述三个概念,每个概念对应着一个类:
①构件—Component,它是该包的核心。是一个抽象类,其他构件都是从它衍生出来的。
②容器—Container,由Component类衍生而来,用来管理构件。
③布局管理器—LayoutManager,确定容器内构件的布局。
2、构件和容器
(1)构件类(Component)
Java的图形用户界而的最基本组成部分是构件(Component),构件量个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,构件不能独立地显示出来,必须将构件放在一定的容器中才可以显示出来。
一般编程过程中采用的都是Component类的子类;Componet类的子类;Component类中也封装了构件通用的方法和属性,Component类的部分重要的成员方法包括:
①getComponentAt(int x,int y),获得坐标(x,y)上的构件对象。
②getFont(),获得构件的字体。
③getForground(),获得构件的前景色。
④getName(),获得构件的名字。
⑤getSize(),获得构件的大小。
⑥paint(Graphics g),绘制构件。
⑦repaint(),重新绘制构件。
⑧update(),刷新构件。
⑨setVisible(boolean b),设置构件是否可见。
⑩setSize(Dimension d),设置构件的大小。
setName(String name),设置构件的名字。
(2)容器类(Container)
Container是一个类,实际上是Component的子类,因此容光焕发器本身也是一个构件,具有构件的所有性质,另外还具有放置其他构件和容器的功能。容器类就像是一个篮筐,构件就像是鸡蛋,编写图形界面的过程就像是鸡蛋放到篮筐的过程,但是,鸡蛋放轩到篮筐的位置和大小是由布局管理器类来决定的。在实际编程过程中,往往采用的都是容器类Container的子类。
(3)布局管理器(LayoutManager)
布局管理器是用来管理构件放轩在容器的位置和大小的。每个容器都有一个布器管理器,当容器需要对某个构件进行定位或判断其在小尺寸时,就会调用其对应的布局管理器。为了使生成的图形用户界面具有良好的平台无关性,Java语言提供了布局管理器这个工具来管理构件在容光焕发器中的布局,而不使用直接设置构件位置和大小的方式。LayoutManager本身是一个接口,编程中通常使用的是实现了该接口的类。
在程序中安排构件的位置和大小时,应该注意以下两点:
①容器中的布局管理器负责各个构件的大小和位置,因此用户无法的这种情况下设置构件的这些属性。
②如果用户确实需要亲自设置构件大小或位置,则应取消该容器的布局管理器,方法为setLayout(null);然后再调用setLocation()、setSize()、setBounds()等方法。
2、常用容器
容器java.awt.Container是Component的子类,一个容器可以容纳多个构件,并使它们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面。所有的构件都可以通过add()方法向容器中添加构件。
有3种类型的容器:Window、Panel、ScrollPane,常用的有Frame、Panel、Applet等。
(1)窗口(Frame)
下面是容器所用包的结构:
java.lang.Object

+----java.awt.Component

+----java.awt.Container

+----java.awt.Window

+----java.awt.Frame
(2)面板(Panel)
下面是容器所用包的结构:
java.lang.Object

+----java.awt.Compont

+----java.awt.Container

+----java.awt.Panel
Panel通常也称为面板,Panel是一种透明的容器,既没有标题,也没有边框,就像一块透明的玻璃。与Frame不同,它不能作为最外层的容器单独存在,它首先必须作为一个构件放置到其他容器中,然后在把它当作容器,把其他构件放到它里面。Panel的作用就是充分利用它既是构件又是从器的特点。
4、LayoutManager(布局管理器)
为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的所有构件安排给一个“布局管理器”负责管理。
布局管理器的相关类主要包括:FlowLayout、BorderLayout、GridLayout、CardLayout、GridBagLayout等。
(1)FlowLayout布局管理器
FlowLayout是Panel和Applet的默认布局管理器。构件在容器中的放置规律是从上到下、从左到右右进行放置,如果容器足够宽,第一个构件先添加到容器中第一行的最左边,后续的构件依次添加到上一个构件的右边,如果当前行已放置不下该构件,则放置到下一行的最左边。FlowLayout的构造方法主要有下面几种:
①FlowLayout(FlowLayout,RIGHT,20,40),第一个参数表示构件的对齐方式,指构件在这一行中的位置是居中对齐、居右对齐还是居左对齐,第二个参数是构件之间的横向间隔,第三个参数是构件之间的纵向间隔,单位是像素。
②FlowLayout(FlowLayout.LEFT),居左对齐,横向间隔和纵向间隔都是默认值5个像素。
③FlowLayout(),默认的对齐方式居中对齐,横向间隔和纵向间隔都是默认值5个像素。
当容器的大不发生变化时,用FlowLayout管理的构件会发生变化,其变化规律是:构件的大小不变,但是相对位置会发生变化。
(2)BorderLayout布局管理器
BorderLayout是Window、Frame和Dialog的默认布局管理器。BorderLayout布局管理器把容器分成5个区域:North、South、East、West和Center,每个区域只能放置一个构件。
如果容器采用BorderLayout进行布局管理,在用add()方法添加构件的时候,必须注明添加到哪个位置。在使用BorderLayout的时候,如果容器的大小发生变化其变化规律为:构件的相对位置不变,大小发生变化。例如容器变高了,则North、South区域不变,West、Center、East区域变高;如果容器变宽了,West、区域不变,North、Center、South区域变宽。
(3)GridLayout布局管理器
GridLayout布局管理器使容器中各个构件呈网格状布局,平均占据容器的空间。即使容器的大小发生变化,每个构件还是平均占据容器的空间。构件在往容器中放置的时候,是按照从上到下、从左到右的规律进行的。
(4)CardLayout布局管理器
CardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,它把容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个构件,当然每层都可以利用Panel来实现复杂的用户界面。牌布局管理器(CardLayout)就像一副叠得整整齐齐的扑克牌一样,有54张牌,但是只能看见最上面的一张牌,第一张牌就相当于牌布局管理器中的每一层,它实现了LayoutManager2接口。
构造方法如下:CardLayout)();CardLayout(int hgap,int vgap);
常用的方法有:
①first(Container parent),显示第一张卡片。
②last(Container parent),显示最后一张卡片。
③next(Container parent),显示下一张卡片。
④previous(Container parent),显示前一张卡片。
⑤show(Container parent,String name),显示指定名称的卡片。
(5)容器的嵌套
在复杂的图形用户界面设计中,为了使布局更加易于管理,具有简洁的整体风格,一个包含了多个构件的容器本身也可以作为一个构件加到另一个容器中去,容器中再添加容器,这样就形成了容器的嵌套。

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

AWT事件处理横型

A
要能够让图形界面接收用户的操作,就必须给各个构件加上事件处理机制。
在事件处理的过程中,主要涉及3类对象:
①Event—事件,用户对界面操作在Java语言让的描述,以类的形式出现。
②Event Source—事件源,事件发生的场所,通常就是各个构件。
③Event handler—事件处理者,接收事件对象并对其进行处理的对象。
由于同一个事件源上可能发生多种事件,因此Java采取了授权处理机制(Delegation Model),事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理。有时也将事件处理者称为临听器,主要原因也在于监听器时刻监听着事件源上所有发生的事件类型,一旦该事件类型与自己所负责处理的委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。事件处理者(监听器)通常是一个类,该类如果要能够处理某种类型的事件,就必须实现与该事件类型相对应的接口。
事件源就是按钮;事件就是ActionEvent对象,而这种事件的产生原因在于用户单击了该事件源按钮;而事件处理者就是ButtonHandler对象,事件发生以后,Java的运行时系统会自动调用ButtonHandler对象的actionPerformed()方法进行处理,而且事件ActionEvent对象将作为参数传递给ac-tionPerformed()方法,在actionPerformed()方法可以通过读取ActionEvent对象的相关信息来得到事件发生时候的情况。
使用授权处理模型进行事件处理的一般方法归纳如下:
①对于某种类型的事件XXXEvent,要想接收并处理这类事件,必须定义相应的事件处理类,该类需要实现与该事件相对应的接口XXXListener。
②事件源实例化以后,必须进行授权,注册该类事件的监听器,使用addXXXListener(XXXListener)方法来注册监听器。
1、事件类
(1)java.lang.Object类
类结构如下所示:
java.lang.Object
│
\+--java.util.EventObject
java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。
public class EventObject implements java.io.Serialization {
protected EventObject(Object source)
public Object getSource();
public String toString();
}
EventObject类继承于是java.lang.Object类,并实现了串行化接口。通过getSource()方法可以得到事件源对象。
(2)java.awt.AWTEvent
与AWT有关的所有事件类都由java.awt.AWTEvent类派生,它也是EventObject类的子类。这些AWT事件分为两大类:低级事件和高级事件。低级事件是指基于构件和容器的事件,当一个构件上发生事件,高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在TextField中按Enter键,或是选中项目列表的某一选项就会触发ActionEvent事件。
①低级事件。
●ComponentEvent—构件事件,构件尺寸的变化,移动。
●ComtainerEvent—容器事件,构件增加,移动。
●WindowEvent—窗口事件,关闭窗口,窗口闭合,图标化。
●FocusEvent—焦点事件,焦点的获得和丢失。
●KeyEvent—键盘事件,键按下、释放。
●MouseEvent—鼠标事件,鼠标单击,移动。
②高级事件(语义事件)。
●ActionEvent—动作事件,按钮按下,TextField中按Enter键。
●AdjustmentEvent—调节事件,在滚动条上移动滑块以调节数值。
●ItemEvet—项目事件,选择项目,不选择“项目改变”。
●TextEvent—文本事件,文本对象改变。
2、配件监听器
每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。
AWT的构件类中提供注册和注销监听器的方法:
①注册监听器。
public void add
(listener);
②注销监听器。
public void remove(listener);
3、AWT事件及其相应的得监听器接口
下表列出了所有AWT事件及其相应的监听器接口,共10类事件,11个接口。 
事件类别 描述信息 接 口 名 方法 
ActionEvent 激活构件 ActionListener actionPerformed(ActionEvent) 
ItemEvent 选择了某些项目 ItemListener itemStateChanged(ItemEvent) 
MouseEvent 鼠标移动 MouseMotion-
Listener mouseDragged(MouseEvent)
mouseMoved(MouseEvent) 
鼠标点击等 MouseListener mousePressed(MouseEvent)
mouseReleased(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mouseClicked(MouseEvent) 
KeyEvent 键盘输入 KeyListener keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent) 
FocusEvent 构件收到或失去焦点 FousListener focusGained(FocusEvent)
focusLost(focusEvent) 
AdjustmentEvent 移动了滚动条等构件 AdjustmentListener adjustmentValueChanged(AdjustmentEvent) 
ComponentEvent 对象移动缩放显示隐
藏等 ComponentListener componentMoved(ComponentEvent)
componentHidden(ComponentEvent)
componentResized(ComponentEvent)
componentShown(ComponentEvent) 
WindowEvent 窗口收到窗口级事件 WindowListener windowClosing(WindowEvent)
windowOpened(WinowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
windowClosed(WindowEvent)
windowDeactivated(WindowEvent)
windowDeactivated(WindowEvent) 
ContainerEvent 容器中增加、删除了
构件 ContainerListener componentAdded(containerEvent)
componentEemoved(containerEvent) 
TextEvent 文本字段或文本区发
生改变 TextListener textValueChanged(TextEvent) 
Java语言类的层次非常分明,因而只支持单继承。为了实现多重继承的能力,Java用接口来实现,一个类可以实现多个接口,这种机制比多重继承具有更简单、灵活、更强的功能。在AWT中就经常用到声明和实现多个接口。但是无论实现了几个接口,接口中已定义的方法必须一一实现,虽然某些方法不需要具体的操作,但可以用空的方法体来代替,而且必须所须方法都要写上。
4、事件适配器
Java语言为一些Listener接口提供了适配器(Adapter)类。可以通过继承事件所对应的Adapter类,重写需要的方法,无关方法不用实现。事件适配器提供了一种简单的实现监听器的手段,可以缩短程序代码。但是,由于Java的单一继承机制,当需要多种监听器或此类已有父类时,就无法采用事件适配器了。
(1)事件适配器—EventAdapter
java.awt.event包中定义的事件适配器类包括以下几个:
①ComponentAdapter,构件适配器。
②ComtainerAdapter,容器适配器。
③7,焦点适配器
④KeyAdpter,键盘适配器。
⑤MouseAdapter,鼠标适配器。
⑥MouseMotionAdapter,鼠标运动适配器。
⑦WindowAdapter,窗口适配器。
(2)用内部类实现事件处理
内部类(inner class)是被定义于另一个类中的类,使用内部类的主要原因是由于:
①一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。②实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能。
③编写事件驱动程序,内部类很方便。
(3)匿名类(Anonymous Class)
当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类,由于匿名类本身无名,因此它也就不存在构造方法,它需要显式地调用一个无参的父类的构造方法,并且重写父类的方法。所谓的匿名就是该类边名字都没有,只是显式地调用一个无参的父类的构造方法。
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

AWT构件库

A

1、基本构件的应用
(1)按钮(Button)
按钮是最常用的一个构件,其构造方法是:
Button b = new Button(”Quit”);
当按钮被点击后,会产生ActionEvent事件,需ActionListener接口进行监听和处理事件。ActionEvent的对象调用getActionCommand()方法可以得到按钮的标识名,默认按钮名为label。用setActionCommand()可以为按钮设置构件标识符。
(2)复选框(Checkbox)
复选框提供简单的“on/off”开关,旁边显示文本标签。
构造方法如下:
setLayout(new GridLayout(3,1));
add(new Checkbox(“one”,null,true));
add(new Checkbox(“two”));
add(new Checkbox(“three”));
复选框用ItemListener来监听ItemEvent事件,当复选框状态改变时用getStateChange()获取当前状态。使用getItem()获得被修改复选框的字符串对象。
class Handler implements ItemListener {
public void itemStateChanged(ItemEvent ev) {
String state = “deselected”;
if(ev.getStaterChange() = = ItemEvent/SELECTED) {
state = “selected”
}
System.out.println(ev.getItem()+” “+state);
}
}
该代码的功能是当选中某个复选框时,在命令行中打印出该复选取框的名字和状态。
(3)复选取框组(CheckboxGroup)
使用复选框组,可以实现单选取框的功能,也就是复选框组中至多只有一个复选框被选中。方法如下:
setLayout(new GridLayour(3,1));
CheckboxGrup cbg = new CheckboxGroup();
add(new Checkbox(“one”,cbg,true));
add(new Checkbox(“two”,cbg,false));
add(new Checkbox(“three”,cbg,false));
(4)下拉式菜单(Choice)
下拉式菜单每次只能选择其中的一项,它能够节省显示空间,适用于大量选项。
Chice colorChooser = new Choice();
colorChooser.add(“Green”);
colorChooser.add(“Red”);
colorChooser.add(“Blue”);
Choice用ItemListener接口来进行监听
(5)Canvas
一个应用程序必须继承Canvas类才能获得有用的功能,比如创建一个自定义构件。如果想在画布上完成一些图形处理,则Canvas类中的paint()方法必须被重写。
Canvas构件监听各种鼠标、键盘事件。当在Canvas构件中输入字符时,必须先调用requestFocus()方法。
(6)单行文本输入区(TextField)
单行文本输入区只能显示一行,当回车键被按下时,会了生ActionEvent事件,可以通过ActionListener中的actionPerformed()方法对事件进行相应处理。可以使用setEditable(boolean)方法设置为只读属性。
单行文本输入区构造方法如下:
TextField tf1,tf2,tf3,tf4:
tf1 = new TextField();tf2 = new TextField(““,20);//显示区域为20列
tf3 = new TextField(“Hello! “);//按文本区域大小显示
tf4 = new TextField(“Hello! “,30);//初始文本为Hello!,显示区域为30列
(7)文本输入区(TextArea)
文本输入区可以显示多行多列的文本。使用setEditable(boolean)方法,可以将其设置为只读的。在TextArea中可以显示水平或垂直的滚动条。
要判断文本是否输入完毕,可以在TextArea旁边设置一个按钮,通过按钮点击产生的ActionEvent对输入的文本进行处理。
(8)列表(List)
列表中提供了多个文本选项,列表支持滚动条,可以浏览多项。
List 1st=new List(4,false);//两个参数分别表示显示的行数、是否允许多选
1st.add(“Venus”);
1st.add(“Earth”);
1st.add(“JavaSoft”);
1st.add(“Mars”);
cnt.add(1st);
(9)框架(Frame)
框架是顶级窗口,可以显示标题,重置大小。当Frame被关闭,将产生WindowEvent事件,Frame无法直接监听键盘输入事件。
(10)对话框(Dialog)
对话框是Window类的子类。对话框和一般窗口的区别在于它依赖于其他窗口。对话框分为非模式(non-modal)和模式(modal)两种。
(11)文件对话框(Filedianlog)
当用户想打开或存储文件时,使用文件对话框进行操作。主要代码如下:
FileDialog d=new FileDialog(ParentFr,”FileDialog”);
d.setVisible(true);
String filename=d.getFile();
(12)菜单(Menu)
无法直接将菜单添加到容器的某一位置,也无法使用布局管理器对其加以控制,菜单只能被添加到“菜单容器”(MenuBar)中。
(13)MenuBar
只能被添加到Frame对象中,作为整个菜单树的根基。
Frame fr = new Frame(“MenuBar”);
MenuBar mb = new MenuBar();
fr.setMenuBar(mb);
fr.setSize(150,100);
fr.setVisble(true);
(14)Menu
下拉菜单,它可以被添加到MenuBar中或其他 Menu中
Frame fr = new Frame(“MenuBar”);MenuBar mb = new MenuBar();
fr.setMenuBar(mb);
Menu m1 = new Menu(“File”);
Menu m2 = new Ment(“Edit”);
Menu m3 = new Ment(“Help”);
mb.add(m1);
mb.add(m2);
mb.setHelpMenu(m3);
fr.setSize(200,200);
fr.setVisible(true);
(15)MenuItem
MenuItem是菜单树中的“叶子节点”。MenuItem通常被添加到一个Menu中。对于MenuItem对象可以添加ActionListener,使用能够完成相应的操作。
(16)构件的外观颜色和字体
①java.awt.Color类提供了颜色的一些方法,可以用颜色常数、颜色的构造方法来产生颜色实例,常数主要包括的颜色有black、blue、cyan、darkGray、gray、green、lightGray、magenta、orange、pink、red、white、yellow。
颜色的构造方法有很多种,其中常用的有:
●Color(int r,int g,int b),r、g、b代表红绿蓝的0~255之间的整数值。
●setForeground(Color.blue),设置构件的前景颜色。
●setBackground(new Color(90,235,50)),设置构件的背景颜色。
java.awt.SystemColor类中封装了系统的默认颜色。另外,在java.awt.color包中提供了java 2D API颜色空间的一些高级应用。
②java.awt.Font和java.awt.FontMetrics提供了字体的操作,同样,在java.awt.font包中提供了java 2D API字体的一些高级应用。
不同的系统环境提供了各种各样的字符集,字体没有实例变量,但是可以通过指定字体名、字型和大小创建一个字体实例。
设置构件的字体用setFont()方法,也可以通过调用Toolkit对象的getFontList()方法获取完整的字体列表。还可以使用默认的toolkit。
2、构件与监听器的对应关系
各个构件与所有的监听器的对应关系如下表,打上“√”表明该构件可以注册此种监听器,也意味着构件上所有可能发生的事件。
用AWT来生成图形化用户界面时,构件和容器的概念非常重要。构件是各种各样的类,封装了图形系统的许多最小单位,而容器也是构件,它的最主要的作用是装载其他构件,但是像Panel这样的容器也经常被作为构件添加到其他容器中,以便完成复杂的界面设计。布局管理器是Java语言与其他编程语言在图形系统方面较为显著的区别,容器中各个构件的位置是由布局管理器来决定的,共有5种布局管理器,每种布局管理都有自己的放置规律。事件处理机制能能够让图形界面响应用户的操作,主要涉及事件源、事件、事件处理者等三方,事件源就是图形界面上的构件;事件就是对用户操作的描述;而事件处理者是处理事件的类。因此,对于AWT中所提供的各个构件,都需要了解该构件经常发生的事件以及处理该事件的相应的监听器接口。此外,AWT的一个重要的特点就是它是重量级的构件,它的实现是通过调用本地平台的图形系统,因此同样一段AWT代码在不同操作系统下看到的图形界面风格是不一样的。
构件/监听器接口 Act Adj Cmp cnt Foc Itm Key Mou MM Text Win
Button √ √ √ √ √ √
Canvas √ √ √ √ √
Checkbox √ √ √ √ √ √
CheckboxMenuItem √
Choice √ √ √ √ √ √
Componet √ √ √ √ √
Container √ √ √ √ √ √
Dialog √ √ √ √ √ √ √
Frame √ √ √ √ √ √ √
Label √ √ √ √ √
List √ √ √ √ √ √ √
MenuItem √
Panel √ √ √ √ √ √
Scrollbar √ √ √ √ √ √
ScrollPane √ √ √ √ √ √
TextArea √ √ √ √ √ √
TextField √ √ √ √ √ √ √
Window √ √ √ √ √ √ √
Act=ActionListener Adj=AdjustmentListener Cmp=ComponentListener
Cnt=ContainerListenerFoc=FocusListenerItm=ItemListener
Key=KeyListenerMou=MouseListenerMM=MouseMotionListener
Text=TextListenerWin=WindowListener

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

用Swing编写图形用户界面

A

1、Swing概述
Swing是Java语言在编写图形用户界面方面的新技术,它在AWT的基础上向前发展,提供了许多开发包,极大地丰富了Java图形蜀面功能。AWT设计的初衷是支持开发应用程序(Java Applet)的简单用户界面,因此功能还不够强大,而早期的AWT甚至不包括弹出式菜单或滚动窗格等基本元素。此外AWT存在着严重的缺陷,人们使AWT适应基于继承的、具有很大促缩性的事件模型,基于同位的体系结构也成为其致命的弱点。由于AWT构件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT构件具有更强的实用性。Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不运行的其他特性。
Swing采用了一种MVC的设计范式即“模型—视图—控制”(Model—View—Conrtoller),其中模型用来保存内容;视图用来显示内容;控制器用来控制用户输入。
Swing外观感觉采用可插入的外观感觉(Pluggable Look and Feel,PL&F)。在AWT构件中,由于控制构件外观的对等类与具体平台相关,使得AWT构件总是只有与本机相关的外观,Swing可以使得Java程序在一个平台上运行时能够有不同的外观,用户可以选择自己习惯的外观。
2、Swing的类层次结构
Swing的类层次结构如下所示:
java.awt.Component
-java.awt.Container
-java.awt.Window
-java.awt.Frame-javax.swing.JFrame
-javax.Dialog-javax.swing.JDialog
-javax.swing.JWindow
-java.awt.Applet-javax.swing.JApplet
-javax.swing.Box
-javax.swing.JComponet
就类的层次结构而言,Swing构件都是AWT的Container类的直接子类和间接子类,尤其是javax.swing.JComponet这个类,许多Swing构件都是它的子类,而它本身又是java.awt.Container类的子类。在javax.swing包中,定义了两种类型的构件:顶层容器(JFrame、JApplet、JDialog和JWindow)和轻量级构件。Swing是JFC(Java Foundation Classes)的一部分,由如下表中的许多包组成。
包 描述
com.sum.swing.plaf.motif 用户界面代表类,实现Motif界面样式
com.sum.java.swing.plaf.windows 用户界面代表类,实现Windows界面样式
javax.swing Swing构件和使用工具
javax.swing.border Swing轻量构件的边框
javax.swing.colorchooser JColorChooser的支持类/接口
javax.swing.event 事件和监听器类
javax.swing.filechooser JFileChooser的支持类/接口
javax.swing.plaf 定义可插入外观性能的接口和微象类
javax.swing.plaf.basic 实现所有标准界面样式公共功能的基类
Javax.swing.plaf.metal 实现Java风格界面的类,是用户界面的默认风格
javax.swing.plaf.multi 实现多种界面风格的类
javax.swing.table 包含JTable构件
javax.swing.text 支持文档的显示和编辑
javax.swing.text.html 支持显示的编辑HTML文档
javax.swing.text.html.parser HTML文档的分析器
javax.swing.text.rtf 支持显示和编辑RTF文件
javax.swing.tree JTree构件的支持类
javax.swing.undo 支持取消操作
swing包是Swing提供的最包,它包含将近一百个类和几十个接口,几乎所有的Swing构件都在swing包中,只有JTableHeader和JTextConent是例外,它们分别在swing.table包和swing.text包中。
swing.event包中定义了事件和事件监听器类,与AWT的event包类似,它们都包括事件类和监听器接口。
swing.table包中主要包括了表格组建(JTable)的支持类。
swing.tree是JTree的支持类。
swing.text、swing.text.html、swing.text.html.parser和swing.text.rtf都是用于显示和编辑文档的包。
3、Swing特性
(1)Swing构件的多样化
Swing是AWT的扩展,它提供了许多新的图形界面构件。Swing构件以“J”开头,除了有与AWT类似的按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等基本构件外,还增加了一个丰富的高层构件集合。
(2)MVC(Model-View-Control)体系结构
Swing胜过AWT的主要优势在于MVC体系结构的普遍使用。在一个MVC用户界面中,存在三个通讯对象:模型、视图和控件。模型是指定的逻辑表示法;视图是模型的可视化表示法;而控件则指定了如何处理用户输入。发模型发生改变时,它会通知所有依赖它的视图,视图使用控件指定其响应机制。
为了简化构件的设计工作,在Swing构件中视图和控件两部分合为一体。每个构件有一个相关的分离模型和它使用的界面(包括视图和控件)。构件的模型是自动设置的,因此Swing构件至少有一个按钮构件。另外,通过Model类的子类或通过实现适当的接口,可以为构件建立自己的模型。把数据模型与构件联系起来用setModel()方法。
MVC是现有的编程语言中制作图形用户界面的一种通用的思想,其思路是把数据的内容本身和显示方式分离开,这样就使得数据的显示更加灵活多样。
(3)可存取性支持
所有Swing构件都实现了Accessible接口,提供对可存取性的支持,使得辅助功能(如屏幕阅读器)能够十分方便地从Swing构件中得到信息。
(4)支持键盘代替鼠标的操作
在Swing构件中,使用JComponent类的registerKeyboardAction()方法,能使用户通过键盘操作来替代鼠标驱动GUI上Swing构件的动作。有些类还为键盘操作提供了更便利的方法。其实这就相当于热键,使得用户可以用键盘替代鼠标进行操作。
(5)设置边框
对Swing构件可以设置一个和多个边框。Swing中提供了各式各样的边框供用户选用,也能建立组合边框或自己设计边框。一种空白边框可以增大构件,协助布局管理器对容器中的构件进行合理的布局。
(6)使用图标(Icon)
与AWT的构件不同,许多Swing构件如按钮、标签,除了使用文字外,还可以使用图标修饰自己。

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Swing构件和容器

A

1、构件的分类
JComponent是一个抽象类是大多数Swing构件的父类,定义了所有子类构件的一般方法,JComponent类继承于Contaier类,所以凡是此类的构件都可作为容器使用。其类层次结构如下所示:
java.lang.Object

+--java.awt.Component

+--java.awt.Comtainer

+--javax.swing.JComponent
(1)构件分类(从功能 上)
①顶层容器,JFrame、JApplet、JDialog和JWindow共4个。
②中间容器,JPanel、JScrollPane、JSplitPane、JToolBar。
③特殊容器,在GUI上起特殊作用的中间层,如JInternalFrame、JLayeredPane、JRootPane。
④基本控件,实现人际交互的构件,如Jbutton、JComboBox、JList、Jmenu、JSlider、JtextField。
⑤不可编辑信息的显示,向用户显示不可编辑信息的构件,例如JLabel、JProgressBar、ToolTip。⑥可编辑信息的显示,向用户显示能被编辑的格式化信息的构件,如JColorChooser、JFileChooser、JFileChooser、JTable、JTextArea。
(2)JComponent类的特殊功能分类
①边框设置,使用setBorder()方法可以设置构件外围的边框,使用一个EmptyBorde对象能在构件周围留出空白。
②双缓冲区,使用双缓冲技术能改进频繁变化的构件的显示效果。与AWT构件不同,JComponent构件默认双缓冲区,不必自己重写代码。如果想关闭双缓冲区,可以在构件上施加setDoubleBuffered(false)方法。
③提示信息,使用setTooltipText()方法,为构件设置对用户有帮助的提示信息。
④键盘导航,使用registerKeyboardAction()方法,能使用户用键盘代替鼠标来驱动构件。JComponent类的子类AbstractButton还提供了便利的方法——用setMnemonic()方法指明一个字符,通过这个字符和一个发前L&F的特殊修饰共同激活按钮动作。
⑤可插入L&F,每个Jcomponent对象有一个相应的ComponentUI对象,为它完成所有的绘画、事件处理、决定尺寸大小等工作。ComponentUI对象依赖当前使用的L&F,用UIManager.setLookAndFeel()方法可以设置需要的L&F。
⑥支持布局,通过设置构件最大,最小、推荐尺寸的方法和设置X、Y对齐参数值的方法能指定布局管理器的约束条件,为布局提供支持。
2、使用Swing的基本规则
与AWT构件不同,Swing构件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(content pane)上。内容面板是顶层容器包含的一个普通容器,它是一个轻量级构件。基本规则如下:
①把Swing构件放入一个顶层Swing容器的内容面板上。
②避免使用非Swing的重量给构件。
对JFrame添加构件有两种方式:
①用getContentPane()方法获得JFrame的内容面板,再对其加入构件frame.getContentPane().add(childComponent)。
②建立一个Jpanel或JDesktopPane之类的中间容器,把构件添加到容器中,再用setContentPane()方法把该容器置为JFrame的内容面板:
Jpanel contentPane=new Jpanel();
…//把其他构件添加到Jpanel中
frame.setContentPane(comtentPane);//把contentPane对象设置成为frame
//的内容面板
3、各种容器面板和构件
(1)根面板
根面板由一个玻璃面板(glassPane)、一个内容面板(contentPane)和一个可选择的菜单条(JMenuBar)组成,而内容面板和可选择的菜单条放在同一分层。玻璃面板是完全透明的,默认值为不可见,为接收鼠标事件和在所有构件上绘图提供方便。
根面板提供的方法有:
①Container getContentPane(),获得内容面板。
②setCintentPane(Container),设置内容面板。
③JMenuBar getMenuBar(),活动菜单条。
④setMenuBar(JMenuBar),设置菜单条
⑤JLayeredPane getLayeredPane(),获得分层面板。
⑥setLayeredPane(JLyaeredpane),设置分层面板。
⑦Component getGlassPane(),获得玻璃面板。
⑧setGlasspane(Component),设置玻璃面板。
(2)分层面板
Swing提供两种分层面板:JIayeredPane和JDesktopPane。JDesktopPane是JLayeredPane的子类,专门为容纳内部框架(JInternalFrame)而设置。
向一个分层面板中添加构件,需要说明将其加入哪一层,指明构件在该层中的位置:add(Component c,Integer Layer,int position)。
(3)面板
面板(JPanel)是一个轻量容器构件 ,用法与Panel相同,用于容纳界面元素,以便在布局管理器的设置下可容纳更多的构件,实现容器的嵌套。JPanel、JScrollPane、JSplitPane和JInteralFrame都属于常用的中间容器,是轻量构件。JPanel的默认布局管理器是FlowLayout。它的类层次结构图如下:
java.lang.Object

+--java.awt.Component

+--java.awt.Container

+--javax.swing.JComponent

+--javax.swing.JPanel
(4)滚动窗口(JScrollPane)
JScrollPane是带滚动条的面板主要是通过移动JViewport(视口)来实现的。JViewport是一种特殊的对象,用于查看基层构件,滚动条实际就是沿着构件移动视口,同时描绘出它在下面“看到”的内容。
(5)分隔板(JSplitPane)
分隔板用于分隔两个构件,这两个构件可以按照水平方向分隔,也可以按照垂直方向分隔。如下所示是它的类层次结构图。
java.lang.Object

+--java.awt.Component

+--java.awt.Container

+--javax.swing.JComponent

+--javax.swing.JPlitPane
JSplitPane的常用方法有:
①addImpl(Component comp,Object constraints,int index),增加指定的构件。
②setTopComponent(Component comp),设置顶部的构件。
③setDividerSize(int newSize),设置拆分的大小。
④setUI(SplitPaneUI ui),设置外观和感觉。
(6)选项板(JTabbedPane)
JTabbedPane提供一组可供用户选择的带有标签或图标的选项,每个选项下面都可以显示一个构件。总共有“One”、“Two”,“Three”、“Four”4个选项,每个选项下面都是一个界面而且每个选项除了文字外还带有一个图标。
JTabbedPane的常用方法有:
①add(String title,Component component),增加一个带特定标签的构件。
②addChangeListener(ChangeListener1),选项板注册一个变化监听器。
(7)工个栏(JToolBar)
JToolBar是用于显示常用工具控件的容器,其位置通常菜单条(或者标题栏)的下面,但是也可以改变它的位置,工具栏就在右侧。用户也可以把工具栏拖拽出来,形成一个独立的可显示工具控件的窗口。
JToolBar的常用方法有:
①JToolBar(String name),构造方法。
②getComponentIndex(Component c),返回一个构件的序号。
③getComponentAtndex(int i),得到一个指定序号的构件。
(8)内部框架(JInternalFrame)
内部框架JInternalFrame就如同一个窗口在另一个窗口内部,其特点如下:
①必须把内部框架添加一个容器中(通常为JDesktopPane),否则不显示。
②不必调用show()或setVisible()方法,内部框架随所在的容器一起显示。
③必须用setSize()、pack()或setBounds方法设置框架尺寸,否则尺寸为零,框架不能显示。
④可以用setLocation()或setBounds()方法设置内部框架在容器中的位置,默认值为0,0,即容器的左上角。
⑤像顶层JFrame一样,对内部框架添加构件也要加在它的内容面板上。
⑥在内部框架中建立对话框,不能使用JDialog作为顶层窗口,必须用JOptionPane或JInternalFrame;
⑦内部框架不能监听窗口事件,可以通过监听与窗口事件类似的内部框架(JInternalFrameEvent)处理内部框架窗口的操作。
内部框架的使用过程如下:
JFrame frame=new JFrame(“InternalFrameDemo”); //实例化窗口
JDesktopPane desktop=new JDesktopPane(); //实例化容器JDesktopPane
MyInternalFrame myframe=new MyInternalFrame();//实例化内部窗口
desktop.add(myframe); //把内部窗口添加到容器中
myframe.setSelected(true); //内部面板是可选择的
frame.setContentPane(desktop); //把desktop设为frame的内容
//面板
(9)按钮(JButton)
按钮是一个常用构件,比AWT与日俱增丰富的是:Swing的按钮上还可以同时显示文字和图标,甚至只有图标都是可以的,这样就构成了图形按钮。JButton的类的层次关系如下所示:java.lang.Object

+--java.awt.Component

+--java.awt.Container

+--javax.swing.JComponent

+--javax.swing.AbstractButton

+--javax.swing.JButton
常用的构造方法有:
①JButton(Icon icon),按钮上只显示图标。
②JButton(String text),铵钮上只显示字符。
③JButton(String text,Icon icon),按钮上既显示图标又显示字符。
(10)复选框(JCheckBox)
Swing的复选框JCheckBoxgn AWT的复选框CheckBox功能一样,提供简单的“on/off”开关,旁边显示文本标签。
(11)单选框(JRadioButton)
在AWT中是通过复选框组CheckBoxGroup来实现单选框的功能的,而在Swing中则直接提供了一个单选框JRadioButton。
(12)选择框(JComboBox)
JComboBox每次只能选择其中的一项,但是可编辑每项的内容,而且每项的内容可以是任意类,而不再局限于String。
(13)文件选择器(JFileChooser)
文件选择器的功能与AWT中的FileDialog类似,是用于选择文件的名字。JFileChooser内建有“打开”、“存储”两种对话框,还可以自己定义其他种类的对话框。
(14)标签(JLabel)
JLabel的功能与AWT中的Label类似,但是JLabel可以提供带图标的标签,图标和文字的位置是可以控制的。
(15)列表(JList)
选项的数量较多时可以列表形式显示,而且列表的项目可以由任意类型对象构成,同时支持单选和多选。
(16)进程条(JProgressBar)
进程条提供一个直观的图形化的进度描述,从“空”到“满”的过程。
(17)滑动杆(JSlider)
滑动杆使得用户能够通过一个滑块的来回移动来输入数据,不需要通过键盘输入数据。
(18)菜单(JMenu)
Swing的菜单结构和AWT的类似,菜单容器是菜单条JMenuBar,菜单是JMenu,菜单项是JMenuItem,还有JCheckBoxMenuItem。但是Swing的菜单结构使用起来更加灵活。
(19)表格(JTable)
表格是Swing新增加的构件,主要功能是把数据以二维表格的形式显示出来。使用表格,依据M-V-C的思想,最好先生成一个MyTableModel类型的对象来表示数据,这个类是从AbstractTableModel类中继承来的,其中有几个方法是一定要重写。JTable类生成的对象以该Tablemodel为参数,并负责将TableModel对象中的数据以表格的形式显示出来。
JTable类常用的方法有:
①getModel(),获得表格的数据来源对象。
②JTable(TableModel dm),dm对象中包含了表格要显示的数据。下列两个构造方法,第一个参数是数据,第二个参数是表格第一行中显示的内容:
JTable(object[ ][ ]rowData,object[ ]columnNams);
JTable(Vector[ ][ ]rowData,Vector[ ]columnNams);
(20)树(JTree)如果要显示一个层次关系分明的一组数据,用树状图表示能给用户一个直观而易用的感觉,JTree类如同Windows的资源管理器的左半部,通过点击可以“打开”、“关闭”文件夹,展开树状结构的图表数据。JTree也是依据M-V-C的思想来设计的,Jtree的主要功能是把数据按照树状进行显示,其数据来源于其他对象。
4、布局管理器
和AWT相同,为了容器中的构件能实现平台无关的自动合理排列,Swing也采用了布局管理器来管理构件的排放、位置、大小等布置任务,在此基础上将显示风格做了改进。
另外一个不同点在于Swing虽然有顶层容器,但是不能把构件直接加到顶层容器中,Swing窗体中含有一个称为内容面板的容器(ContentPane),在顶层容器上放内容面板,然后把构件加入到内容面板中,前面已介绍如何得到和设置内容面板。所以,在Swing中,设置布局管理器是针对于内容面板的。
Swing继续沿用AWT中的布局管理器,包括FlowLayout、BorderLayout、CardLayout、gridLayout、GridBagLayout,另外Swing新增加一个BoxLayout布局管理器。BoxLayout布局管理器按照自上而下(y轴)或者从左到右(x轴)的顺序布局依次加入构件。建立一个BoxLayout对象,必须指明两个参数;被布局的容器和BoxLayout的主轴。默认情况下,构件在纵轴方向上居中对齐。

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Swing的事件处理机制

A

Swing的事件处理机制继续沿用AWT的事件处理机制,因此基本的事件处理需要使用java.awt.event这个包中的类,另外java.swing.event包中也增加了一些新的事件及其监听器接口。事件处理机制中仍旧包含3个角色:事件源、事件和事件处理者(事件监听程序)。事件源就是Swing的各种构件,与之对应的就是事件监听器接口,Swing中事件源及其对应的事件监听器接口如下表。
Wing事件源 事件监听器接口 所属的包
AbstractButton
JTextField
Timer
JDirectoryPane ActionListener java.awt.event
JScrollBar AdjustmentListener java.awt.event
JComponent AncestorListener javax.swing.event
DefaltCellEditor CellEditorListener javax.swing.event
AbstractButton
DefaultCaret
JProgessBar
JSlider
JTabbedPane
JTabbedPane
JViewport ChangeListener javax.swing.event
AbstractDocument DocumentListener javax.swing.event
AbstractButton
JComboBox ItemListener java.awt.event
JList ListSelectionListener javax.swing.event
JMenu MenuListener javax.swing.event
AbstractAction
JComponent
TableColum PropertyChangeListener java.awt.event
JTree TreeSelectionListener javax.swing.event
JPopupMenu WindowListener

How well did you know this?
1
Not at all
2
3
4
5
Perfectly