图形用户界面设计.ppt_第1页
图形用户界面设计.ppt_第2页
图形用户界面设计.ppt_第3页
图形用户界面设计.ppt_第4页
图形用户界面设计.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12章 图形用户界面设计,本章要点: AWT基本组件 AWT容器 布局管理器 AWT事件处理模型 Swing图形用户界面设计,12.1 AWT工具集简介,Java的抽象窗口工具包(Abstrac Window Toolkit,AWT)中包含了许多类来支持GUI设计。AWT由Java的java.awt提供,该包中有许多用来设计GUI的组件类,如按钮、菜单、列表和文本框等组件类,同时它还包含窗口、面板等容器类。 在学习GUI编程时,必须理解和掌握两个概念:容器类(Container)和组件类(Component)。java.awt包中一部分类的层次关系如下图所示。,Component类的部分子类,例12-1 程序清单 Component_Test.java import java.awt.Button; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Frame; public class Component_Test public static void main(String args) Frame fr=new Frame(“洪恩软件“); / 实例化一个容器对象。 fr.setLayout(new FlowLayout(); Button button1=new Button(“英语产品“); Button button2=new Button(“电脑产品“); fr.add(button1); fr.add(button2); fr.setSize(200,300); /调用方法setSize(int,int)设置容器的大小。 fr.setBackground(Color.blue); /设置背景色为蓝色。 fr.setVisible(true); fr.validate(); ,12.2 AWT基本组件,12.2.1 标识(Label) AWT中最简单的就是标识了。所谓标识实质上就是一段文字,但它与文字不同的是它是AWT构件。所以在每次repaint时,不用重新添加。大多数AWT构件都有多种构造方法,Label类中定义了三种: (1)Label()构造一个空的标识。 (2)Label(String text)构造建立一个以String为内容的标识。 (3)Label(String text, int alignment)定义一个String标识。 这里int参数代表一个给定的对齐方式。可以是靠左、靠右和居中,默认设置是居中。为了便于记忆,在Label类中定义了相应的常量,Label.LEFT、Label.CENTER和Label.RIGHT。,12.2.2 按钮(Button) 按钮是AWT中最常见的一种组件,用户可以通过单击该组件来实现特定的操作,当然,如果希望按钮响应用户的单击操作,就需要实现相关的鼠标单击事件。有关事件处理方面的内容,将在12.5节中介绍。Button类的构造方法有两种: (1)Button()构造一个没有名称的按钮。 (2)Button(String label)构造一个指定名称的按钮。 按钮组件的生成方式如下: Button butobj=new Button (“确定“); 上面的语句生成了一个标记文字为“确定”的按钮。,12.2.3 画布(Canvas) 一个应用程序必须继承Canvas类才能获得有用的功能,比如创建一个自定义组件。如果想在画布上完成一些图形处理,则Canvas类中的paint()方法必须被重写。 Canvas组件监听各种鼠标,键盘事件。当在Canvas组件中输入字符时,必须先调用requestFocus()方法。,例12-2 程序清单 Canvas_Test.java import java.awt.Canvas; import java.awt.Frame; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class Canvas_Test implements KeyListener, MouseListener Canvas can; / 声明一个画布对象 String str = “; public static void main(String args) Frame f = new Frame(“Canvas例子“); Canvas_Test myCanvas = new Canvas_Test(); myCanvas.can = new Canvas(); f.add(“Center“, myCanvas.can); f.setSize(150, 150); myCanvas.can.addMouseListener(myCanvas); / 注册监听器 myCanvas.can.addKeyListener(myCanvas); / 注册监听器 f.setVisible(true); ,public void mouseClicked(MouseEvent ev) System.out.println(“发生鼠标单击事件,位置是“+ev.getX()+“,“+ev.getY(); can.requestFocus();/ 获得焦点,表示该窗口将接收用户的键盘和鼠标输入 /* 方法keyTyped是keyPressed和keyReleased方法的组 * 合,当键被按下又释放时,keyTyped方法被调用 */ public void keyTyped(KeyEvent ev) System.out.println(“发生键盘事件“); str += ev.getKeyChar(); / 获取每个输入的字符,依次添加到字符串str中 can.getGraphics().drawString(str, 0, 20); / 显示字符串str public void keyPressed(KeyEvent ev) System.out.println(“发生键盘按下事件“); public void keyReleased(KeyEvent ev) System.out.println(“发生键盘释放事件“); ,public void mousePressed(MouseEvent ev) System.out.println(“发生鼠标按下事件,位置是“+ev.getX()+“,“+ev.getY(); public void mouseReleased(MouseEvent ev) System.out.println(“发生鼠标释放事件,位置是“+ev.getX()+“,“+ev.getY(); public void mouseEntered(MouseEvent ev) System.out.println(“发生鼠标进入事件,位置是“+ev.getX()+“,“+ev.getY(); public void mouseExited(MouseEvent ev) System.out.println(“发生鼠标离开事件“); ,12.2.4 复选框(Checkbox) Checkbox类一般不需要定义相应的操作,它只是用来让用户设置某些选项。Checkbox类可以有两种使用方式。一种是一次可以选择多项,即复选框。另一种是一次只能选择一项,即单选按钮。这里介绍的是复选框,单选按钮另外介绍。 Checkbox类常用的构造方法有3种: (1)Checkbox()构造一个空的复选框条目,未被选中。 (2)Checkbox(String label)构造一个以String为标识的复选框条目,未被选中。 (3)Checkbox(String label, CheckboxGroup group, boolean state)构造一个以String为标识的复选框条目。,12.2.5 单选按钮(Radio Buttons) 单选按钮的使用方法与复选框使用方法基本相同,所不同的是所有条目必须属于一个条目组,在这个条目组中,一次只能选择一个条目。CheckboxGroup类的构造方法是: CheckboxGroup()构造一个条目组。 在构造完一个条目组,就可以把条目加入到这个条目组中。在加入条目时,不要忘记只有一个条目能被预先选中。例如: CheckboxGroup cbqobj = new CheckboxGroup(); Checkbox cl = new Checkbox ( “ one “ , cbgobj, true); Checkbox cZ = new Checkbox ( “ two “ , cbqobj, false);,12.2.6 菜单(Choice Menu) 选择菜单是指弹出式菜单,用户可以在菜单的条目中进行选择。选择菜单在Java中是由Choice类实现的。Choice类的构造方法是: Choice()构造一个选择菜单。 构造完之后,再使用Choice类中的addItem方法加入菜单的条目。条目在菜单中的位置由条目添加的顺序决定,Choice类建立一个整数索引以便于检索。 下面是一个较为完整的例子。 Choice c = new Choice(); c.addItem(“语文“); c.addItem(“数学“); c.addItem(“计算机“); add(c);,12.2.7 菜单项(MenuItem) MenuItem是菜单树中的“叶子节点”。MenuItem通常被添加到一个Menu中。对于MenuItem对象可以添加ActionListener,使其能够完成相应的操作。MenuItem类的构造方法有三种: (1)MenuItem() 构造一个空的、没有快捷键的菜单项。 (2)MenuItem(String label) 构造一个指定的没有快捷键的菜单项。 (3)MenuItem(String label, MenuShortcut s) 构造一个指定的且有快捷键的菜单项。 例如: Menu m1 = new Menu(“文件“); MenuItem mi1 = new MenuItem(“新建“); MenuItem mi2 = new MenuItem(“保存“); MenuItem mi3 = new MenuItem(“退出“); m1.add(mi1); m1.add(mi2); m1.addSeparator(); m1.add(mi3);,12.2.8 列表框(Scrolling List) 列表框的功能与弹出式菜单相似,也是让用户在几个条目中作出选择,但又有一些区别。列表框是由List类实现的,List类的构造方法有三种: (1)List() 构造一个空的列表框。 (2)List(int rows) 构造一个指定行数的列表框。 (3)List(int rows, boolean multipleMode) 构造一个指定行数的列表框。 int类型参数为指定的行数,boolean类型参数确定这个列表是多选还是单选。true表示多选,false表示单选。与Choice类相同,在构造一个List类后,也要用addItem方法添加列表中的条目。在添加条目的同时,也会建立一个整数索引。,12.2.9 单行文本输入框(TextField) 在许多情况下,用户可能还需要输入一些文字,这时就需要文本输入框。单行文本输入框是由TextField类实现的。TextField类的构造方法有四种: (1)TextField() 构造一个新的单行文本输入框。 (2)TextField(int columns) 构造一个指定长度、初始内容为空的单行文本输入框。 (3)TextField(String text) 构造一个指定初始内容的单行文本输入框。 (4)TextField(String text, int columns) 构造一个指定长度、指定初始内容的单行文本输入框。 例如: add(new Label(“你的名字: “); add(new TextField(30);,12.2.10 文本输入区(TextArea) 文本输入区的功能与单行文本输入框的功能相同,只是它能显示更多的文字。因为单行文本输入框只能输入一行的文字,所以在需要输入和显示较多的文字时,就要用到多行文本输入框。多行文本输入框是由TextArea类实现的。TextArea类的构造方法有4种: (1)TextArea() 构造一个新的多行文本输入框。 (2)TextArea(int rows, int columns) 构造一个指定长度和宽度的多行文本输入框。 (3)TextArea(String text) 构造一个显示指定文字的多行文本输入框。 (4)TextArea(String text, int rows, int columns) 构造一个指定长度、指定宽度,并显示指定文字的多行文本输入框。,12.2.11 滚动条(Scrollbar) 在列表框和多行文本输入框中,当需要时系统会自动加入滚动条。在某些情况下,特别是关于数字的操作时,需要单独使用滚动条。滚动条是由Scrollbar类实现的。Scrollbar类的构造方法有3种。 (1)Scrollbar() 构造一个新的垂直的滚动条。 (2)Scrollbar(int orientation) 构造一个指定方向的滚动条 (3)Scrollbar(int orientation,int value,int visible,int minimum, int maximum) 根据给定参数构造一个滚动条。其中第一个参数orientation指定滚动条的方向。第二个参数value指定滑动块的初始位置。第三个参数visible指定滚动条的宽度。第四个参数minimum和第五个参数maximum是滚动条的最小值和最大值。 在Scrollbar类中,定义了两个常量HORIZONTAL和VERTICAL,在指定滚动条的方向时可以使用这两个常量。,12.2.12 文件对话框(Filedialog) 当用户想打开或存储文件时,可以使用文件对话框进行操作。Filedialog类的构造方法有3种: (1)FileDialog(Frame parent) 构造一个打开文件的对话框。 (2)FileDialog(Frame parent, String title) 构造一个含有标题的文件对话框。 (3)FileDialog(Frame parent, String title, int mode) 构造一个含有标题的、打开或存储文件的对话框。 下面构造了一个含有标题的文件对话框: FileDialog d=new FileDialog(ParentFr,“FileDialog“); d.setVisible(true); String filename=d.getFile();,12.2.13 一个AWT的综合例子 例12-3 程序清单 AWT_Test.java import java.awt.Button; import java.awt.Checkbox; import java.awt.CheckboxGroup; import java.awt.Choice; import java.awt.Color; import java.awt.Label; import java.awt.TextArea; import java.awt.TextField; public class AWT_Test extends java.applet.Applet public void init() setBackground(Color.white); add(new Label(“你的名字: “); add(new TextField(30); add(new Label(“性别: “); CheckboxGroup cbg = new CheckboxGroup(); add(new Checkbox(“男“, cbg, true);,add(new Checkbox(“女“, cbg, false); add(new Label(“你喜欢的水果: “); add(new Checkbox(“苹果“); add(new Checkbox(“桔子“); add(new Checkbox(“香蕉“); add(new Checkbox(“桃子“); add(new Label(“你每次吃几个水果: “); Choice c = new Choice(); c.addItem(“少于1个“); c.addItem(“1个到3个“); c.addItem(“3个以上“); add(c); add(new Label(“你觉得吃水果有什么好处: “); add(new TextArea(“我认为 “, 3, 60); add(new Button(“ 确定 “); add(new Button(“ 重写 “); ,运行结果,12.3 AWT容器,12.3.1 Frame Frame(框架)是Java中最重要、最常用的容器之一,是Java Application程序的图形用户界面。框架是一个顶级窗口,它不能被其他容器所包含,并且具有自己的外边框和标题。框架对象由类Frame 创建,其构造方法如下: (1)Frame() 构造一个空的、无标题的框架窗口。 (2)Frame(String title) 构造一个空的、标题为title的框架窗口。 (3)Frame(GraphicsConfiguration gc) 用指定的绘图配置gc创建一个空的、无标题的框架窗口,gc为null时使用系统的默认配置。 (4)Frame(String title, GraphicsConfiguration gc) 用指定的绘图配置gc构造一个空的、标题为title的框架窗口,gc为null时使用系统的默认配置。,例12-4 程序清单 Frame_Test.java import java.awt.Color; import java.awt.Frame; public class Frame_Test extends Frame public static void main(String args) Frame_Test fr = new Frame_Test(“Hello human!“); / 构造方法 fr.setSize(400, 300); / 设置Frame的大小,默认为(0,0) fr.setBackground(Color.cyan); / 设置Frame的背景,默认为青兰色 fr.setVisible(true); / 设置Frame为可见,默认为不可见 public Frame_Test(String str) super(str); / 调用父类的构造方法 ,12.3.2 Panel Panel(面板)是最常用、也是最简单的一种容器,它没有边框或其他边界,不能被移动、放大、缩小或关闭,并且无法单独使用,必须被添加到其他容器中;面板也可以处理事件,但一定要使其先获得输入焦点。 通常,使用面板的目的是为了层次化管理图形界面的各个组件,使组件在容器中的布局操作更为方便,所以面板常用来进行容器嵌套,以完成图形界面的良好布局。 面板对象由类Panel创建,其构造方法如下。 (1)Panel() 创建一个面板对象。 (2)Panel(LayoutManager layout) 创建一个面板对象,并指定布局管理器为layout。,例12-5 程序清单 FrameWithPanel.java import java.awt.Color; import java.awt.Frame; import java.awt.Panel; public class FrameWithPanel extends Frame public FrameWithPanel(String str) super(str); public static void main(String args) FrameWithPanel fr = new FrameWithPanel(“Frame with Panel“); Panel pan=new Panel(); fr.setSize(400,300); fr.setBackground(Color.red); / 框架fr的背景颜色设置为红色 fr.setLayout(null); / 取消布局管理器 pan.setSize(150,150); pan.setBackground(Color.blue); / 设置面板pan的背景颜色为蓝色 fr.add(pan); / 用add方法把面板pan添加到框架fr中 fr.setVisible(true); ,12.4 布局管理器,Java为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的所有组件安排给一个“布局管理器”负责管理,如将组建的排列顺序,组件的大小、位置,当窗口移动或调整大小后组件如何变化等功能授权给对应的容器布局管理器来管理,不同的布局管理器使用不同算法和策略,容器可以通过选择不同的布局管理器来决定布局。 布局管理器主要包括:FlowLayout,BorderLayout,GridLayout,CardLayout,GridBag- Layout。,12.4.1 FlowLayout FlowLayout是Panel、Applet的默认布局管理器。其组件的放置规律是从上到下、从左到右进行放置,如果容器足够宽,第一个组件先添加到容器中第一行的最左边,后续的组件依次添加到上一个组件的右边,如果当前行已放置不下该组件,则放置到下一行的最左边。 构造方法主要下面几种: (1)FlowLayout() 默认的对齐方式居中对齐,横向间隔和纵向间隔都是默认值5个像素。 (2)FlowLayout(FlowLayout.LEFT) 居左对齐,横向间隔和纵向间隔都是默认值5个像素。 (3)FlowLayout(FlowLayout.RIGHT,20,40) 第一个参数表示组件的对齐方式,指组件在这一行中的位置是居中对齐、居右对齐还是居左对齐,第二个参数是组件之间的横向间隔,第三个参数是组件之间的纵向间隔,单位是像素。,例12-6 程序清单 FlowLayout_Test.java import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; public class FlowLayout_Test public static void main(String args) Frame f = new Frame(); f.setLayout(new FlowLayout(); Button button1 = new Button(“确定“); Button button2 = new Button(“保存“); Button button3 = new Button(“关闭“); f.add(button1); f.add(button2); f.add(button3); f.setSize(300, 150); f.setVisible(true); ,12.4.2 BorderLayout BorderLayout是Window、Frame和Dialog的默认布局管理器。BorderLayout布局管理器把容器分成5个区域:North、South、East、West和Center,每个区域只能放置一个组件。,例12-7 程序清单 BorderLayout_Test.java import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; public class BorderLayout_Test public static void main(String args) Frame f = new Frame(“BorderLayout“); f.setLayout(new BorderLayout(); f.add(“North“, new Button(“北“); / 第一个参数表示把按钮添加到容器的North区域 f.add(“South“, new Button(“南“); / 第一个参数表示把按钮添加到容器的South区域 f.add(“East“, new Button(“东“); / 第一个参数表示把按钮添加到容器的East区域 f.add(“West“, new Button(“西“); / 第一个参数表示把按钮添加到容器的West区域 f.add(“Center“, new Button(“中“); / 第一个参数表示把按钮添加到容器的Center区域 f.setSize(200, 200); f.setVisible(true); ,12.4.3 GridLayout GridLayout(网格布局管理器)是使用较多的布局管理器,它基于网络(即行列)放置组件。这种布局管理器把容器的空间划分成若干行乘若干列的网络区域,并平均占据容器的空间,组件就位于这些划分出来的小格中。,例12-8 程序清单 GridLayout_Test.java import java.awt.Button; import java.awt.Frame; import java.awt.GridLayout; public class GridLayout_Test public static void main(String args) Frame f = new Frame(“GridLayout测试“); f.setLayout(new GridLayout(3, 2); / 容器平均分成3行2列共6格 f.add(new Button(“1“); / 添加到第一行的第一格 f.add(new Button(“2“); / 添加到第一行的下一格 f.add(new Button(“3“); / 添加到第二行的第一格 f.add(new Button(“4“); / 添加到第二行的下一格 f.add(new Button(“5“); / 添加到第三行的第一格 f.add(new Button(“6“); / 添加到第三行的下一格 f.setSize(200, 200); f.setVisible(true); ,12.4.4 CardLayout CardLayout(牌布局管理器)能够帮助用户处理两个以至更多的成员共享同一显示空间,它把容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件,当然每层都可以利用Panel来实现复杂的用户界面。CardLayout就像一副叠得整整齐齐的扑克牌一样,有许多张牌,但是用户只能看见最上面的一张牌,每一张牌就相当于牌布局管理器中的每一层。 使用first(),last(),next(),previous()和show()方法均可使卡片成为可见的。下面是一个简单的例子。 setLayout( new CardLayout(); Panel one = new Panel(); add(first, one); Panel two = new Panel(); add(second, two); Panel three = new Panel(); add(third, three); show(this, second);,12.4.5 GridBagLayout GridBagLayout是一种非常灵活的版面布局。它是在将屏幕划分成网格的基础上,允许每个组件占据一个或多个单元(显示区域)。GridBagLayout管理的每个组件都有一个相应的GridBagConstraints实例,通过这个实例来安排组件的位置。要有效地使用GridBagLayout类,必须为该组件定义一个GridBagConstraints实例,并正确设置实例变量。,例12-9 程序清单 GridBagLayout_Test.java import java.awt.Button; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.applet.Applet; public class GridBagLayout_Test extends Applet public void init() resize(300, 100);/ 设置窗口的大小 / 使用类GridBagConstriants GridBagConstraints gbc = new GridBagConstraints(); / 设定外观管理器为GridBagLayout外观管理器 setLayout(new GridBagLayout(); gbc.fill = GridBagConstraints.BOTH;/ 所有的按钮都会把分配的剩余空间填满 gbc.gridwidth = 1;/ 设置第一个按钮的大小 gbc.gridheight = 1; Button Button1 = new Button(“东“); (GridBagLayout) getLayout().setConstraints(Button1, gbc); add(Button1);,gbc.gridwidth = GridBagConstraints.REMAINDER; / 第二个按钮填满整行空间 Button Button2 = new Button(“西“); (GridBagLayout) getLayout().setConstraints(Button2, gbc); add(Button2); gbc.gridheight = 4;/ 设置第三个按钮的大小 gbc.gridwidth = 1; Button Button3 = new Button(“南“); (GridBagLayout) getLayout().setConstraints(Button3, gbc); add(Button3); gbc.gridheight = 2;/ 设置第四个按钮的大小 gbc.gridwidth = 2; Button Button4 = new Button(“北“); (GridBagLayout) getLayout().setConstraints(Button4, gbc); add(Button4); gbc.gridwidth = GridBagConstraints.REMAINDER;,Button Button5 = new Button(“中“); (GridBagLayout) getLayout().setConstraints(Button5, gbc); add(Button5); gbc.insets = new Insets(5, 6, 7, 8);/ 设置第五个按钮的位置 Button Button6 = new Button(“洪恩软件“); (GridBagLayout) getLayout().setConstraints(Button6, gbc); add(Button6); ,12.4.6 容器的嵌套 例12-10 程序清单 GUI_Test.java import java.awt.Button; import java.awt.Frame; import java.awt.Panel; public class GUI_Test private Frame f; private Panel p; private Button bw, bc; private Button bfile, bhelp; public static void main(String args) GUI_Test gui = new GUI_Test(); gui.go_Test(); ,public void go_Test () f = new Frame(“容器的嵌套“); bw = new Button(“West“); bc = new Button(“洪恩软件“); f.add(bw, “West“); f.add(bc, “Center“); p = new Panel(); f.add(p, “North“); bfile = new Button(“File“); bhelp = new Button(“Help“); p.add(bfile); p.add(bhelp); f.pack(); f.setVisible(true); ,12.5 AWT事件处理模型,上一节中的主要内容是如何放置各种组件,使图形界面更加丰富多彩,但是还不能响应用户的任何操作,要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制。在事件处理的过程中,主要涉及三类对象: Event事件,用户对界面操作在Java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。 Event Source事件源,事件发生的场所,通常就是各个组件,例如按钮Button。 Event handler事件处理者,接收事件对象并对其进行处理的对象。,AWT事件传递和处理机制,例12-11 程序清单 Button_Test.java import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Button_Test public static void main(String args) Frame f = new Frame(“按钮测试“); Button b = new Button(“请单击我!“); /* 注册监听器进行授权,该方法的参数是事件处理者对象,要处理 * 的事件类型可以从方法名中看出,例如本方法要授权处理的是 * ActionEvent,因为方法名是addActionListener。 */ b.addActionListener(new ButtonHandler(); f.setLayout(new FlowLayout(); / 设置布局管理器 f.add(b);,f.setSize(200, 100); f.setVisible(true); class ButtonHandler implements ActionListener / 实现接口ActionListener才能做事件ActionEvent的处理者 public void actionPerformed(ActionEvent e) / 系统产生的ActionEvent事件对象被当作参数传递给该方法 System.out.println(“按钮事件发生!“); /*本接口只有一个方法,因此事件发生时,系统会自动调用本方法, * 需要做的操作就把代码写在这个方法里。 */ ,12.5.1 事件类 低级事件 ComponentEvent(组件事件:组件尺寸的变化、移动) ContainerEvent(容器事件:组件增加、移动) WindowEvent(窗口事件:关闭窗口,窗口闭合,图标化) FocusEvent(焦点事件:焦点的获得和丢失) KeyEvent(键盘事件:键按下、释放) MouseEvent(鼠标事件:鼠标单击、移动) 高级事件(语义事件) ActionEvent(动作事件:按钮按下,TextField中按Enter键) AdjustmentEvent(调节事件:在滚动条上移动滑块以调节数值) ItemEvent(项目事件:选择项目,不选择“项目改变”) TextEvent(文本事件:文本对象改变),12.5.2 事件监听器 每一个事件类都有一个“唯一”的事件处理接口,例如处理鼠标事件“MouseEvent”类的对应接口为“MouseListener”接口,而处理“ActionEvent”事件类的对应接口为“ActionListener”接口。 例如:当选择菜单时就会激发一个动作事件ActionEvent,在程序中就要加入一个能够“听到”这个事件的接口,实现这个接口并处理监听到的事件。事件ActionEvent对应的接口是ActionListener,下来我们实现这个接口。 class handler implements ActionListener ,12.5.3 AWT事件及其相应的监听器接口,12.5.4 事件适配器 1. 事件适配器EventAdapter 下例中采用了鼠标适配器: import java.awt.*; import java.awt.event.*; public class MouseClickHandler extends MouseAdaper public void mouseClicked(MouseEvent e) /只实现需要的方法 java.awt.event包中定义的事件适配器类包括以下几个: (1)ComponentAdapter 组件适配器 (2)ContainerAdapter 容器适配器 (3)FocusAdapter 焦点适配器 (4)KeyAdapter 键盘适配器 (5)MouseAdapter 鼠标适配器 (6)ouseMotionAdapter 鼠标运动适配器 (7)WindowAdapter 窗口适配器,2. 用内部类实现事件处理 内部类(inner class)是被定义于另一个类中的类,使用内部类的主要原因是由于一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能。编写事件驱动程序,内部类很方便。因此内部类所能够应用的地方往往是在AWT的事件处理机制中。,3. 匿名类(Anonymous Class) 当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类的构造方法,并且重写父类的方法。,12.6 Swing简介,12.6.1 Swing与AWT 前面几节中我们学习了AWT,AWT是Swing的基础。Swing的产生主要原因就是AWT不能满足图形化用户界面发展的需要。AWT设计的初衷是支持开发小应用程序的简单用户界面。例如AWT缺少剪贴板、打印支持、键盘导航等特性,而且原来的AWT甚至不包括弹出式菜单或滚动窗格等基本元素。此外AWT还存在着严重的缺陷,人们使AWT适应基于继承的、具有很大伸缩性的事件模型,基于同位体的体系结构也成为其致命的弱点。 随着发展的需要,Swing出现了,Swing组件几乎都是轻量组件,与重量组件相比,没有本地的对等组件,不像重量组件要在它们自己的本地不透明窗体中绘制,轻量组件在它们的重量组件的窗口中绘制。,12.6.2 Swing程序结构简介 Swing的程序设计一般可按照下列流程进行: (1)引入Swing包; (2)选择“外观和感觉”; (3)设置顶层容器; (4)设置按钮和标签; (5)向容器中添加组件; (6)在组件周围添加边界; (7)进行事件处理。,例12-15 程序清单 Swing_Test.ja

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论