1、第5章 图形用户界面设计,复习提问,1.Vector类与数组有什么区别?,2.在什么情况下可以考虑使用Vector类?,3.简要说明java.lang的特殊性。 (可以使用JDK文档),5.1 AWT概述,5.1.1 AWT组件的一般功能 在AWT(Abstract Window Toolkit)的概念中,窗口系统中所显示的各种对象统称为“组件”(Component)。组件有基本组件和容器组件之分。顾名思义,基本组件是不可再分割的组件,基本组件各自都有它们特定的功能。基本组件是构成图形用户界面的基本元素。 除了菜单以外的所有组件都是Component类的子类。从Component类中,它们继承
2、了大量的功能,Component类为实现所有的绘画功能及事件处理提供了基础。参见P91-图5-1。,5.1 AWT概述,5.1.1 AWT组件的一般功能 1大小和位置可以控制:所有组件的显示尺寸和位置都是由布局管理器控制的。组件本身也提供了一些方法改变组件的尺寸,将组件放到适当的位置以及报告组件的合适和最小尺寸。组件还提供了一些方法用于返回关于组件当前尺寸和位置的信息。 2外形可以控制:颜色、字体、效果 3基本绘图功能的支持:Component类提供了paint()、update()和repaint()方法,这些方法使组件能够在屏幕上将自己画出来。 4组件状态可以控制: Component类定
3、义了handleEvent()等一组方法,例如:action()方法,用来处理指定类型的事件;Component类也提供了设置并获得键盘光标,使键盘能够对组件进行控制等方法。,5.1 AWT概述,5.2 Frame和Panel,5.2.1 Frame框架类 AWT的Window类使用户可以创建独立于包含App1et的浏览器窗口的窗口。 Window类提供了用于窗口操作的基本功能。通常,用户使用Window类的子类Frame类和Dialog类。Frame类使用户可以创建带有菜单条的全功能窗口,即框架;Dialog类用于创建和管理对话框。,5.2 Frame和Panel,5.2.1 Frame框架
4、类的构造方法: new Frame() /创建不带标题的框架 new Frame(String s) / 创建带有指定标题的框架 说明:当一个Frame窗口被创建以后,需要调用setSize()方法来设置窗口的大小,并调用setVisible(true)方法来显示窗口,5.2 Frame和Panel,5.2.1 框架类示例 import java.awt.*; /此包必须引入 public class MyFrame extends Frame /继承Frame类public static void main(String args)MyFrame fr=new MyFrame(“Please
5、 see there!This is a frame“);fr.setSize(400,200); /窗口大小为400*200fr.setBackground(Color.blue); /背景为兰色fr.setVisible(true); /设置窗口可见 public MyFrame(String str) super(str); /调用父类的构造方法 ,5.2 Frame和Panel,5.2.2 Panel面板类 面板是能在屏幕上实际显示的组件。面板继承了Container类,它提供容纳其他组件的功能。Applet类是Panel类的一个子类。要在一个Panel中嵌套其他面板,用户只能创建一个
6、新的Panel,并把它加到窗体(如:Frame或Applet)中,就像用户加入其他GUI组件一样,面板无边框,不能单独使用。,5.2 Frame和Panel,5.2.2 Panel面板类 面板的构造方法有: Panel() 建立一个新面板,采用默认的布局管理器 Panel(LayoutManager layout) 建立一个新面板,采用指定的布局管理器 从构造方法可以看出,面板没有标题,它由布局管理器进行布局的管理,5.2 Frame和Panel,5.2.2 Panel面板类举例 import java.awt.*; class PanelTest extends Panel public s
7、tatic void main(String args)PanelTest p= new PanelTest(); Frame f=new Frame(“在框架中添加面板示例!“); f.add(p); /将面板添加到框架窗体 f.setSize(300,200); f.setVisible(true);,5.3 布局管理器,一般概念: 在缺省情况下,每个容器中都有布局管理器。如果容器的缺省布局管理器不能满足用户的需要,用户可以使用别的布局管理器来代替缺省的。 AWT提供了五种布局管理器:FlowLayout、GridLayout、BorderLayout、CardLayout和GridBag
8、Layout。 各布局管理器对容器的管理方法不同。,5.3 布局管理器,关于默认布局管理器: 如果用户不指定容器所使用的布局管理器,那么容器将使用自己缺省的布局管理器。每当容器需要改变外观时,这些缺省的布局管理器会发挥作用。大多数布局管理器的方法都不需要程序直接调用。AWT提供的布局管理器各有各的长处和缺点。见教材P83表1、表2。,5.3 布局管理器,选择布局管理器的基本原则 用户要求尽量使用所有的空间来显示组件,可以考虑使用BorderLayout和GridBagLayout。如果使用BorderLayout,用户应该将占用空间最大的组件放在中心部位。如果使用GridLayout,用户需要
9、为组件设置限制条件。 用户需要在紧凑的一行中以组件的自然尺寸显示较少组件时,用户可以考虑用面板容纳组件,并使用面板的缺省布局管理器FlowLayout。 用户需要在多行或多列中显示一些同样尺寸的组件,GridLayout最适合此情况。如果有必要的话,可以使用面板来容纳组件。,5.3 布局管理器,5.3.1 FlowLayout顺序布局管理器 特点:FlowLayout也称为流式布局管理器,其排版方式就像流程或文本处理器在处理一段文字一样,常用于RadioButton或CheckBox等组件的排列 ,它将组件逐个放置在容器的一行中,一行满后另起一行。,5.3 布局管理器,5.3.1 FlowLa
10、yout顺序布局管理器的构造方法 public FlowLayout() 建立默认布局 public FlowLayout(int align) 设置对齐方法,对齐常量包括FlowLayout.LEFT 、FlowLayout.RIGHT 、FlowLayout.CENTER public FlowLayout(int align,int hgap,int vgap) 参数hgap和vgap表示组件的水平间距和垂直间距,5.3 布局管理器,顺序布局管理器举例 import java.awt.*; public class TestFlowLayoutpublic static void mai
11、n(String args)Frame f=new Frame(“这是一个布局管理器“);f.setLayout(new FlowLayout();f.add(new Button(“第一个按钮“);f.add(new Button(“第二个按钮“);f.add(new Button(“第三个按钮“);f.add(new Button(“第四个按钮“);f.setSize(300,300);f.setVisible(true); ,5.3 布局管理器,5.3.2 BorderLayout边界布局管理器BorderLayout将容器分为东、南、西、北、中5 个区域,按照上北下南左西右东的格局分布
12、,各用一个方位单词表示 东:East 南:South 西:West 北:North 中:Center,5.3 布局管理器,5.3.2 BorderLayout边界布局管理器 import java.awt.*; public class TestBorderLayoutpublic static void main(String args)Frame f=new Frame(“这是一个边界布局管理器”);f.add(new Button(“第一个按钮”);f.add(new Button(“第二个按钮”);f.setSize(300,300);f.setVisible(true); ,5.3
13、布局管理器,5.3.3 GridLayout网格布局管理器 GridLayout网格布局管理器用于将容器区域划分为一个矩形网格(区域),其组件按行和列排列,每个组件占一格。,5.3 布局管理器,5.3.3 GridLayout的构造方法: GridLayout() /成一个单列的网格布局 GridLayout(int row,int col) 生成一个设定行数和列数的网格布局 GridLayout(int row,int col,int horz,int vert) 可以设置组件之间的水平和垂直间隔,5.3 布局管理器应用举例,网格布局示例: import java awt.*; public
14、 class GridLayoutExamplepublic static void main(String args)Frame f=new Frame(“网格布局演示!“);String str=“1“,“2“,“3“,“4“,“5“,“6“,“7“,“8“,“9“; f.setLayout(new GridLayout(3,3);Button btn=new Buttonstr.length; / 创建按钮数组for(int i=0;istr.length;i+)btni=new Button(stri); f.add(btni); f.setSize(300,200);f.setVis
15、ible(true); ,复习提问,1、说出8种窗口组件。,2、框架和面板有什么不同?,3、FlowLayout是什么?有哪些主要特点?,5.3 布局管理器,5.3.4 CardLayout卡片布局管理器 卡片布局管理器是采用卡片式的管理方法,可存储几个不同的布局,每个布局就像是一个卡片组中的一张卡片,在一个给定的时间总会且只有一张卡片在顶层,其它卡片看不到,5.3 布局管理器,设计一个卡片组共5张卡片,每隔一定时间切换一张。 import java.applet.Applet; public class CardLayoutDemo extends AppletCardLayout card
16、=new CardLayout();pubilc void init()setLayout(card);for(int i=1;i=5;i+)add(String.valueOf(i),new Button(“卡片号:“+i);card.show(this,String.valueOf(i);for (int j=1;j1000;j+) ; /等待1000次运算,起延迟作用 ,5.3 布局管理器,5.3.5 GridBagLayout网格包布局管理器 网格包布局管理器可以使组件具有不同的大小,且程序能够控制 网格包布局管理器的组件不一定只占一个网格,可占多个网格 网格包布局管理器的组件可以由程
17、序选择放置位置,不是自动由左到右,由上到下排列。 网格包布局对每个组件施加空间控制是通过类GridBagConstraints(网格包约束条件)来实现的,5.4 AWT事件模型,5.4.1 JDK1.0和JDK1.1事件处理模型 JDK1.0的事件处理模型:采用层次型的事件模型。当事件产生时,它先被送往产生该事件的组件(component), 如事件在这里未被处理,它就会被自动送往该组件的Container, 如Container也未对事件进行处理,则还会递交给该Container的上一层Container(如果有的话).,5.4 AWT事件模型,JDK1.1之后的事件模型 采用委托代理模型
18、:当事件产生时,该事件被送到产生该事件的组件去处理,而要能够处理这个事件,该组件必须登记(register)有与该事件有关的一个或多个被称为listeners的类,这些类包含了相应的方法能接受事件并对事件进行处理,5.4 AWT事件模型,5.4.2 事件监听器 每种事件的类型都有其自己的注册方法。一般形式为: public void addListener(EvenTypeListener e),5.4 AWT事件模型,5.4.2 事件监听器 1、AWT的事件类型及其监听器 (1)WindowEvent窗口事件 引发原因是有关窗口操作引发的事件,其事件监听接口是WindowListener。接
19、口方法包括7个,它们都必须实现 接口适配器是WindowAdapter 注册窗口事件的方法是addWindowListener,5.4 AWT事件模型,5.4.2 事件监听器 (2)ActionEvent活动事件 引发原因:单击按扭,双击列表框中选项,选择菜单项,文本框中的回车。 事件监听接口:ActionListener 接口方法:actionPerformed(ActionEvent e) 组件注册该事件方法:addActionListener(监听者),5.4 AWT事件模型,5.4.2 事件监听器 (3)TextEvent文本事件 引发原因:文本框或文本区域内容改变 事件监听接口:Te
20、xtListener 接口方法:textValueChanged(TextEvent e) 组件注册该事件方法:addTextListener(监听者),5.4 AWT事件模型,5.4.2 事件监听器 (4)ItemEvent选项事件 引发原因:改变列表框中的选中项、改变复选框选中状态、改变下拉选单的选中项。 事件监听接口:ItemListener 接口方法:itemStateChanged(ItemEvent e) 组件注册该事件方法:addItemListener(监听者),5.4 AWT事件模型,5.4.2 事件监听器 (5)AdjustmentEvent调整事件 引发原因:操作滚动条改
21、变滑块位置 事件监听接口:AdjustmentListener 接口方法:adjustmentValueChanged(AdjustmentEvent e) 组件注册该事件方法:addAdjustmentListener(监听者),5.4 AWT事件模型,5.4.2 事件监听器 (6)KeyEvent键盘事件 引发原因有三种: 敲完键(KEY-TYPED) 按下键 (KEY-PRESSED) 释放键 (KEY-RELEASE) 事件监听接口:KeyListener,5.4 AWT事件模型,5.4.2 事件监听器 (7)MouseEvent事件 引发原因:鼠标作用在一个组件上。 鼠标事件:鼠标键
22、按下,鼠标键抬起,单击鼠标 ,鼠标光标进入一个组件,鼠标光标离开一个组件。 鼠标移动事件:鼠标移动,鼠标拖动。,5.4 AWT事件模型,5.4.2 事件监听器 (8)FocusEvent焦点事件 引发原因: 组件获得焦点 组件失去焦点 事件监听接口 :FocusListener,5.4 AWT事件模型,5.4.2 事件监听器 (9)ComponentEvent组件事件 引发原因:当组件移动、改变大小、改变可见性时引发。 事件监听接口:ComponentListener。 接口适配器:ComponentAdapter。 组件注册该事件方法:addComponentListener。,5.4 AW
23、T事件模型,5.4.2 事件监听器 (10)ContainerEvent容器事件 引发原因:当容器内增加或移走组件时引发。 事件监听接口:ContainerListener 接口适配器:ContainerAdapter。 容器注册该事件方法:addContainerListener,5.4 AWT事件模型,5.4.3 事件适配器 监听器中的抽象方法在程序中都必须实现才可以正常运行,即使内容为空也不能省略 为了简化代码编写,Java提供了一个叫做适配器的类。在适配类中系统自动实现了相应接口中的全部方法,但内容都是空,5.4 AWT事件模型,5.4 AWT事件模型,5.4.3 事件适配器 如:对于
24、鼠标事件,在MouseListener接口中,声明了如下5个方法,需要逐一实现。 MouseClicked(MouseEvent e) MouseEntered(MouseEvent e) MouseExited(MouseEvent e) MouseReleased(MouseEvent e) MousePressed(MouseEvent e),5.4 AWT事件模型,5.4.3 事件适配器 创建新类时,就不必再实现全部方法了,只要继承适当的适配器,并且覆盖所关心的事件处理方法即可 如:对于MouseAdapter有如下定义-,5.4 AWT事件模型,5.4.3 事件适配器 public
25、abstract class MouseAdapter implements MouseListener public void mouseClicked(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited (MouseEvent e) public void mouseReleased(MouseEvent e) public void mousePressed(MouseEvent e) ,5.4 AWT事件模型,5.4.3 事件适配器 例:用适配器实现窗口的关闭。 import java
26、.awt.*; import java.awt.event.*; /以下同时注册适配器和监听器 class ButtonExample extends WindowAdapter implements ActionListenerFrame f;Button b;public static void main(String args)ButtonExample be=new ButtonExample();be.init();,5.4 AWT事件模型,5.4.3 事件适配器 public void init()f=new Frame(“适配器例题“);b=new Button(“按这里有声音“);b.addActionListener(this);f.add(b,“South“);f.addWindowListener(this);f.setSize(300,300);f.setVisible(true); ,5.4 AWT事件模型,5.4.3 事件适配器 public void actionPerformed(ActionEvent e)Toolkit.getDefaultToolkit().beep(); public void windowClosing(WindowEvent e) System.exit(0);/只实现了一个抽象方法即可 ,