第五章GUI程序设计与常用组件_第1页
第五章GUI程序设计与常用组件_第2页
第五章GUI程序设计与常用组件_第3页
第五章GUI程序设计与常用组件_第4页
第五章GUI程序设计与常用组件_第5页
已阅读5页,还剩243页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章第五章 程序设计程序设计 及事件驱动机制及事件驱动机制 图形用户界面图形用户界面 事件驱动机制事件驱动机制教学内容n5.1 图形用户界面概述n5.2 事件驱动设计n5.3 Swing容器和组件n5.3 Swing的基本组件n5.5 布局管理器n5.6 Swing其它组件教学目标n掌握使用Swing编写图形用户界面程序的基本方法n熟悉应用Swing的容器和组件的概念n准确描述Swing中常用组件的作用及主要方法的功能n熟悉应用Swing的基本组件设计图形用户界面n通过布局管理器设计窗口布局 用户界面用户界面:用户与计算机进行交互的渠道,:用户与计算机进行交互的渠道,人人( (眼睛和眼睛和手

2、指手指) )和计算机(硬件和软件)的通信,协同完成一定和计算机(硬件和软件)的通信,协同完成一定任务。任务。与计算机输入与计算机输入/输出过程都相关。输出过程都相关。 人的主体参与人的主体参与:接受信息、思考、决策、发出命令。:接受信息、思考、决策、发出命令。 计算机软硬件参与的工作计算机软硬件参与的工作:进一步明确所要执行命令,:进一步明确所要执行命令,执行计算,反馈信息。执行计算,反馈信息。人与计算机交互有两种方式:人与计算机交互有两种方式:q 命令行式全字符命令行式全字符用户界面用户界面q 图形用户界面:让计算机变得更加容易使用图形用户界面:让计算机变得更加容易使用5.1 GUI概述概述

3、面向对象的图形用户界面面向对象的图形用户界面:基于:基于“面向对象面向对象”的思想互相交的思想互相交换信息,即尽可能在屏幕上用形象的图标和窗口等来代表有换信息,即尽可能在屏幕上用形象的图标和窗口等来代表有用的资源和可启用的对象。用的资源和可启用的对象。图形界面对象:图形界面对象:代表特定的软件、命令、过程、资源、提示代表特定的软件、命令、过程、资源、提示信息等信息等q 图标(图标(Icon)q 窗口(窗口(Window)q 菜单(菜单(Menu)/菜单项(菜单项(Menu Item)q 按钮(按钮(Button)、文本框()、文本框(Label)、列表框()、列表框(List)q 5.1 GU

4、I概述概述图形界面编程的主要特征:图形界面编程的主要特征:q 图形界面对象及其框架(图形界面对象及其框架(图形界面对象之间的包含关系图形界面对象之间的包含关系)q 图形界面对象的布局(图形界面对象的布局(图形界面对象之间的位置关系图形界面对象之间的位置关系)q 图形界面对象上的事件响应(图形界面对象上的事件响应(图形界面对象上的动作图形界面对象上的动作)5.1 GUI概述概述5.1 GUI概述如图是我们常用的Jcreator的GUI图图5-1 JCreator的的GUI n在Java中,AWT(Abstract Windowing Tookit,抽象窗口工具包)是用来处理图形最基本的方式,它可

5、以用来创建Java的applet及窗口程序。5.1 GUI概述(续)5.1 GUI概述(续)AWT是Java早期的技术,提供的组件有限,无法满足应用程序组件多样化的要求。为了弥补这个不足,Sun公司开发出Swing包,它有别于AWT,不依赖于特定的系统平台,对外提供多样化的组件及外观,并且保持外观风格的一致。 5.1.1 GUI组成元素分类 n构成图形用户界面的各种元素和成份可以粗构成图形用户界面的各种元素和成份可以粗略地分为三类:容器(略地分为三类:容器(container)、组件)、组件(components)和用户自定义成份。和用户自定义成份。1容器容器容器是用来组织或容纳其他界面成份和

6、元容器是用来组织或容纳其他界面成份和元素的组件。素的组件。Java提供了相应的容器类,例如,框架提供了相应的容器类,例如,框架(JFrame/Frame)、面板)、面板(JPanel/Panel)及滚动面板)及滚动面板(JScrollPanel/ScrollPanel)等类。)等类。2组件组件与容器不同,组件是图形用户界面的基与容器不同,组件是图形用户界面的基本单位。组件是一个可以以图形化的方式本单位。组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象显示在屏幕上并能与用户进行交互的对象,5.1.1 GUI组成元素分类(续) 例如例如:一个按钮,一个标签等。一个按钮,一个标签等。

7、组件不能独立地显示出来,必须将组件放组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。在一定的容器中才可以显示出来。5.1.1 GUI组成元素分类(续) 3用户自定义成份用户自定义成份除了上述的标准图形界面元素外,编程人除了上述的标准图形界面元素外,编程人员还可以根据用户的需要,使用各种字型字员还可以根据用户的需要,使用各种字型字体和颜色设计一些几何图形、标志图案等,体和颜色设计一些几何图形、标志图案等,它们被称作用户自定义成份。它们被称作用户自定义成份。 用户自定义成份通常只起到显示结果、用户自定义成份通常只起到显示结果、装饰美化的作用,不能响应用户的动作,不装饰美化的作用,

8、不能响应用户的动作,不具有交互功能。具有交互功能。 5.1.2 AWT和Swing介绍 nSun公司提供了两个图形工具类包公司提供了两个图形工具类包AWT和和Swing,负责构建,负责构建GUI界面。界面。由于由于AWT直接调用本地图形构件来实直接调用本地图形构件来实现图形界面,对本地平台依赖比较现图形界面,对本地平台依赖比较多,因此也被称做重量级组件。多,因此也被称做重量级组件。用用AWT构件的构件的GUI往往在不同的操作系统往往在不同的操作系统平台上具有不同的风格,而且平台上具有不同的风格,而且GUI的性的性能也受到了限制。能也受到了限制。nSwing重写了重写了AWT中的组件,还为这些组

9、件中的组件,还为这些组件增添了新的图形用户界面的组件,增强了增添了新的图形用户界面的组件,增强了GUI与与Java程序的交互功能程序的交互功能5.1.2 AWT和Swing介绍(续) Swing是用是用Java编写的,实现时降低了对平台编写的,实现时降低了对平台的依赖,也被称做轻量级组件,方便用户创建的依赖,也被称做轻量级组件,方便用户创建出跨平台的出跨平台的GUI。Swing和和AWT部分组件的继承关系和层次关系部分组件的继承关系和层次关系如图如图5-2所示。所示。图图5-2 Swing和和AWT部分组件的继承和层次关系部分组件的继承和层次关系5.1.2 AWT和Swing介绍(续) jav

10、a.awt包中最核心的类就是包中最核心的类就是Component类,它类,它是构成是构成Java图形用户界面的基础,大部分组件都是图形用户界面的基础,大部分组件都是由该类派生出来的。由该类派生出来的。 Component类是一个抽象类,类是一个抽象类,其中定义了组件所具有的一般功能:其中定义了组件所具有的一般功能:基本的绘画支持基本的绘画支持(paint, repaint, update等等) 字体和颜色等外形控制字体和颜色等外形控制(setFont,等等) 大小和位置控制大小和位置控制(SetSize, SetLocation等等) 图象处理图象处理(实现接口实现接口ImageObserve

11、r) 组件状态控制组件状态控制(SetEnable, isEnable, isVisible, isValid等等) ,。5.1.2 AWT和和Swing介绍介绍 - Component类类 常见的组件包括:常见的组件包括:Button, Checkbox, CheckboxGroup, Choice, Label, List, TextComponent, Scrollbar等。等。5.1.2 AWT和和Swing介绍介绍 - Component类类5.1.2 AWT和和Swing介绍介绍 - Component类类 Container类是由类是由Component类派生出来的一种特类派生出

12、来的一种特殊类,用来表示各种殊类,用来表示各种GUI组件的容器,其主要功能包组件的容器,其主要功能包括:括: 组件的管理:方法组件的管理:方法add()可以向其中添加一个组件,可以向其中添加一个组件,remove()删除其中的一个组件,删除其中的一个组件, 布局管理:每个布局管理:每个Container类都和一个布局管理类都和一个布局管理器相联,以确定其中组件的布局。器相联,以确定其中组件的布局。 Container类可类可以通过以通过setLayout()方法设置某种布局方式。方法设置某种布局方式。 常见的常见的Container类有:类有:Frame, Panel, Applet等。等。5

13、.1.2 AWT和和Swing介绍介绍 - Container类类菜单类也是一种重要的图形组件,只不过菜菜单类也是一种重要的图形组件,只不过菜单类并不是由一般的单类并不是由一般的Component类派生的,类派生的,而是从而是从MenuComponent类继承得到的。类继承得到的。5.1.2 AWT和和Swing介绍介绍 - Menu类类Java中提供了各种布局管理器类来管理各种组中提供了各种布局管理器类来管理各种组件在容器中的放置状态件在容器中的放置状态,这些类都是实现了这些类都是实现了LayoutManager接口的接口的.标准的布局管理器类有:标准的布局管理器类有: FlowLayout

14、 BorderLayout GridLayout CardLayout GridBagLayout 还可以通过实现还可以通过实现LayoutManager接口来定义接口来定义自己的布局管理器。自己的布局管理器。5.1.2 AWT和和Swing介绍介绍 -布局管理器类布局管理器类Graphics类是所有用来在组件上进行图形绘类是所有用来在组件上进行图形绘制时所使用的图形环境上下文的父类,它提供制时所使用的图形环境上下文的父类,它提供了对组件进行图形绘制的一般方法的接口,一了对组件进行图形绘制的一般方法的接口,一个个Graphics对象中封装了用来进行图形绘制对象中封装了用来进行图形绘制时必须得状

15、态信息,包括:时必须得状态信息,包括: 要绘制的组件对象要绘制的组件对象 当前颜色当前颜色 当前字体当前字体 当前逻辑点操作的功能(当前逻辑点操作的功能(XOR和和Paint) 当前当前XOR方式的替代颜色方式的替代颜色 5.1.2 AWT和和Swing介绍介绍 - Graphics类类 Graphics类还提供了一系列的方法来绘制几何类还提供了一系列的方法来绘制几何图形、文字、图象以及动画:图形、文字、图象以及动画: Lines:drawLine() Rectangles:drawRect(), fillRect() 和和 clearRect()Ovals:drawOval() 和和 fil

16、lOval() Arcs:drawArc() 和和 fillArc() Polygons :drawPolygon() 和和 fillPolygon() Text :drawString() Image :drawImage()5.1.2 AWT和和Swing介绍介绍 - Graphics类类 事件类:描述各种事件的类,包括事件类:描述各种事件的类,包括Event类、类、 AWTEvent类及其子类。类及其子类。 字体类:用来表示字体的类字体类:用来表示字体的类,通过它可以在通过它可以在 GUI中使用多种系统支持的字体。中使用多种系统支持的字体。 图象类:用来表示与处理图象的类图象类:用来表示

17、与处理图象的类 (GIF、JEPG)。)。 颜色类:封装了各种颜色。颜色类:封装了各种颜色。 其他类:光标类、各种几何类等其他类:光标类、各种几何类等 5.1.2 AWT和和Swing介绍介绍 - 其它类其它类javax.swing包中包含了存包中包含了存java的完整的类的完整的类集以支持集以支持GUI程序的设计(轻量级构件)程序的设计(轻量级构件)java.lang.Objectjava.awt.Componentjava.awt.Containerjavax.swing.JComponent.5.1.2 AWT和和Swing介绍介绍 -swing JLabel显示一行文字,可带图标显示一

18、行文字,可带图标JTextField 用户让用户输入一行文字的构件用户让用户输入一行文字的构件JButton用于点击执行命令用于点击执行命令JCheckBox标记状态标记状态JRadioButton标记多状态标记多状态JCombox下拉列表框供选取下拉列表框供选取JList一组列表项供选择一组列表项供选择5.1.2 AWT和和Swing介绍介绍 - swingn在进行用户界面设计时,经常会用到Graphics类、 Color类和Font类,分别用来绘制图形、设置颜色和字体,这三个类属于java.awt包,同样可以在创建Swing界面时使用5.1.3 颜色、字体和图形颜色、字体和图形 5.1.3

19、 颜色、字体和图形(续) 一一Graphics类类Graphics类是所有图形类的根类,允许应用类是所有图形类的根类,允许应用程序在组件上进行图形绘制。程序在组件上进行图形绘制。1.如何获得如何获得Graphics对象:对象:(1)调用调用Component类的类的getGraphics()方法。()方法。 比如,想在窗口中绘制一个矩形,下面的语句就比如,想在窗口中绘制一个矩形,下面的语句就可以实现。可以实现。Graphics g=frame.getGraphics();g.drawRect(30,60,140,40); npublic class MyjavaApplet extends A

20、ppletpublic class MyjavaApplet extends Appletn n public void paint(Graphics g) public void paint(Graphics g)n n g.setColor(Color.red); g.setColor(Color.red);n g.setFont(new Font(SansSerif,Font.BOLD,28); g.setFont(new Font(SansSerif,Font.BOLD,28);n g.drawString( g.drawString(“我在学我在学习习Java Java 小应用程序小

21、应用程序! !”); ); n n (2).paint()/ paintComponent(Graphics g) 或或 update()方法方法 AWT提供了一个自发性的paint()方法,Swing包里叫paintComponent(Graphics g) .5.1.3 颜色、字体和图形(续) 这两个这两个方法在下列情况发生时,会自动运行:方法在下列情况发生时,会自动运行:1当新建的窗口显示在显示器上,或从隐藏变成当新建的窗口显示在显示器上,或从隐藏变成显示时;显示时;2从缩小图标还原之后;从缩小图标还原之后;3正在改变窗口的大小时正在改变窗口的大小时4. . 有输出需求时有输出需求时总结

22、:当有重绘需求的时候,自动执行总结:当有重绘需求的时候,自动执行类Graphics的常用方法 类Graphics的常用方法(续) 注意,上面的所有方法只要涉及到坐标,均是以窗口注意,上面的所有方法只要涉及到坐标,均是以窗口的左上角为原点,向右为正的左上角为原点,向右为正x方向,向下为正方向,向下为正y方法。方法。图图5-3 AWT的绘图的绘图例5.1 AWT绘图示例(续) Graphics类定义了很多绘制图形的方法。这些方类定义了很多绘制图形的方法。这些方法与法与Color类和类和Font类结合,就能绘制出不同颜类结合,就能绘制出不同颜色的图形以及在图形中绘制各种文字符号色的图形以及在图形中绘

23、制各种文字符号。例:一个简单的绘图程序例:一个简单的绘图程序 DrawTest.java例5.1 AWT绘图示例 class DrawFrame extends JFrame public DrawFrame() setTitle(DrawTest); setSize(WIDTH, HEIGHT); / add panel to frame DrawPanel panel = new DrawPanel(); Container contentPane = getContentPane(); contentPane.add(panel); public static final int WID

24、TH = 400; public static final int HEIGHT = 400; nclass DrawPanel extends JPaneln n public void paintComponent(Graphics g)n n super.paintComponent(g);n Graphics2D g2 = (Graphics2D)g;n / draw a rectanglen double leftX = 100;n double topY = 100;n double width = 200;n double height = 150;n Rectangle2D r

25、ect = new Rectangle2D.Double(leftX, topY, width, height);n g2.draw(rect);例例5.1 AWT绘图示例绘图示例 n Ellipse2D ellipse = new Ellipse2D.Double();n ellipse.setFrame(rect);n g2.draw(ellipse)n / draw a diagonal linen g2.draw(new Line2D.Double(leftX, topY, n leftX + width, topY + height);n / draw a circle with t

26、he same centern double centerX = rect.getCenterX();n double centerY = rect.getCenterY();n double radius = 150;n Ellipse2D circle = new Ellipse2D.Double();n circle.setFrameFromCenter(centerX, centerY,n centerX + radius, centerY + radius);n g2.draw(circle);n n例例5.1 AWT绘图示例绘图示例 5.1.3 颜色、字体和图形(续) 二二Colo

27、r类类Color类用于封装默认sRGB颜色空间中的颜色,或者用于封装由ColorSpace标识的任意颜色空间中的颜色。Color类中已经创建了一些常见的颜色对象,包类中已经创建了一些常见的颜色对象,包括括BLACK、BLUE、CYAN、GRAY、GREEN、MAGENTA、ORANGE、PINK、RED、WHITE等,等,这些颜色对象可以直接使用。这些颜色对象可以直接使用。当然,也可以通过当然,也可以通过Color类的构造方法来创建颜类的构造方法来创建颜色。表色。表5-2列出了列出了Color类的构造方法。类的构造方法。5.1.3 颜色、字体和图形(续) 设置颜色的方法: java.awt.G

28、raphicsnvoid setcolor(Color c)njava.awt.Graphic2Dnvoid setPaint(paint p) njava.awt.Componentnvoid setBackground(Color c)nvoid setForeground(Color c)5.1.3 颜色、字体和图形(续) 比如,要使用一个红色对象,下面几种方法都可以实现:5.1.3 颜色、字体和图形(续) Color.redColor.REDnew Color(255,0,0)new Color(1.0,0.0,0.0)例例5.5.填充颜色的例子填充颜色的例子FillTest.java

29、FillTest.javaclass FillPanel extends JPanel public void paintComponent(Graphics g) super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; / draw a rectangle double leftX = 100; double topY = 100; double width = 200; double height = 150; 例例5.5.填充颜色的例子填充颜色的例子Rectangle2D rect = new Rectangle2D.Double

30、(leftX, topY,width, height); g2.setPaint(Color.red); g2.fill(rect); / draw the enclosed ellipse Ellipse2D ellipse = new Ellipse2D.Double(); ellipse.setFrame(rect); g2.setPaint(new Color(0, 128, 128); / a dull blue-green g2.fill(ellipse); 例例5.5.填充颜色的例子填充颜色的例子三三Font类类Font类是用来设置所用文字的字体、大小和样式等类是用来设置所用文字

31、的字体、大小和样式等。5.1.3 颜色、字体和图形(续) Font(String fontname,int style,int size)1.定义字体定义字体2.设置字体的成员方法设置字体的成员方法setFont(Font f)例:设置字体的例子例:设置字体的例子FontTest.java例例5.35.3设置字体的例子设置字体的例子class FontPanel extends JPanel public void paintComponent(Graphics g) super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; String

32、message = Hello, World!; Font f = new Font(Serif, Font.BOLD, 36); g2.setFont(f); / measure the size of the message FontRenderContext context = g2.getFontRenderContext(); Rectangle2D bounds = f.getStringBounds(message, context); / set (x,y) = top left corner of text double x = (getWidth() - bounds.ge

33、tWidth() / 2; double y = (getHeight() - bounds.getHeight() / 2; / add ascent to y to reach the baseline double ascent = -bounds.getY(); double baseY = y + ascent; / draw the messagen g2.drawString(message, (int)x, (int)(baseY);n g2.setPaint(Color.gray);n / draw the baselinen g2.draw(new Line2D.Doubl

34、e(x, baseY, n x + bounds.getWidth(), baseY);n / draw the enclosing rectanglen Rectangle2D rect = new Rectangle2D.Double(x, y, n bounds.getWidth(), n bounds.getHeight();n g2.draw(rect);n n例例5.35.3设置字体的例子设置字体的例子5.1.4 图形用户界面程序的设计 n使用AWT构建一个图形用户界面的基本步骤:3.创建布局管理器,用来自动设置容器中组件的位创建布局管理器,用来自动设置容器中组件的位置和大小。置和

35、大小。4.使用委派事件模型来响应用户操作,实现用户和使用委派事件模型来响应用户操作,实现用户和程序的交互。程序的交互。 AWT中各种基本组件类如表中各种基本组件类如表5-3所示。所示。 1.创建容器组件(如创建容器组件(如Frame、Panel等)等)2.在容器中添加需要的其他组件(如在容器中添加需要的其他组件(如Button等)。等)。AWT基本组件AWT创建图形用户界面示例例例5.5. 显示一个数字验证窗口,并通过信息显示是否输入显示一个数字验证窗口,并通过信息显示是否输入正确正确Jpro4.java。AWT创建图形用户界面示例(续)n运行结果如图5-4所示。 图图5-4 AWT窗口示例程

36、窗口示例程序序 5.2 AWT的事件驱动模型nJava事件处理机制涉及三个非常重要的概念:事件源、事件和事件监听器(也称作事件处理者)。1.事件源是指产生事件的对象,如容器、按钮等。3.事件监听器:能够接收事件源通知的对象。 2.事件:用于在事件源与事件监听器间传递信息的对象。事件源事件源监听器监听器消消息息事件事件驱动程序驱动程序Java AWTJava AWT事件驱动模型事件驱动模型 5.1 Java 5.1 Java 事件处理机制事件处理机制5.2.1 委托事件模型n一.事件源n 能够产生事件的对象都可以成为事件源.如:文本框、按钮、鼠标、键盘等n 一个事件源是一个能够注册监听器并且为监

37、听器发送消息的一些对象二.监听器1.监听器类:一个使用了专门事件监听器接口的类,该类必须实现接口中的方法.这些方法就是事件驱动方法,当事件发生时,被自动指行。2.监听器:由监听器类创建的对象.监听器对象会接收事件源对象发送的消息,并对发生的事件作出反应.5.2.1 委托事件模型5.2 注册监听器方法n监听器类必须使用与事件源相对应的接口(例:ActionListener),从而必须 提供接口中的方法:nactionPerformed(ActionEvent event)n的实现,此方法即是与事件相关联的事件驱动方法监听器类的定义监听器类的定义 class Mylistener class My

38、listener implements ActionListener implements ActionListener./使用了与事件相对应的接口使用了与事件相对应的接口 public void actionPerformed(public void actionPerformed( ActionEvent event) ActionEvent event) . . /实现了接口里的方法实现了接口里的方法 MylistenerMylistener类的对象就可以用来作监听器类的对象就可以用来作监听器监听器类的定义监听器类的定义三三. .注册监听器注册监听器 例:例: MyListener li

39、stener=new MyListener(); JButton button=new JButton(“ok”); button.addActionListener(Listener);eventSourceObject.addEventListener( eventListenerObject)例5.5事件驱动方法的实现npublic class ButtonTestn public static void main(String args)n n ButtonFrame frame = new ButtonFrame(); frame.setDefaultCloseOperation(J

40、Frame.EXIT_ON_CLOSE);n frame.show();n nclass ButtonFrame extends JFramenn public ButtonFrame()n n setTitle(ButtonTest);n setSize(WIDTH, HEIGHT);n ButtonPanel panel = new ButtonPanel();n Container contentPane = getContentPane();n contentPane.add(panel);n n public static final int WIDTH = 300;n public

41、 static final int HEIGHT = 200; 例5.5事件驱动方法的实现nclass ButtonPanel extends JPaneln n public ButtonPanel()n n JButton yellowButton = new JButton(Yellow);n JButton blueButton = new JButton(Blue);n JButton redButton = new JButton(Red);n add(yellowButton);n add(blueButton);n add(redButton);n ColorAction ye

42、llowAction = new ColorAction(Color.yellow);n ColorAction blueAction = new ColorAction(Color.blue);n ColorAction redAction = new ColorAction(Color.red);n yellowButton.addActionListener(yellowAction);n blueButton.addActionListener(blueAction);n redButton.addActionListener(redAction);n n 例5.5事件驱动方法的实现n

43、private class ColorAction implements ActionListenern n public ColorAction(Color c)n n backgroundColor = c;n n public void actionPerformed(ActionEvent event)n n setBackground(backgroundColor);n repaint();n n private Color backgroundColor;n nn四四. .用匿名类简化程序用匿名类简化程序在例在例ButtonTest.javaButtonTest.java中,每个

44、按钮需要中,每个按钮需要同样的处理:同样的处理: 1.1.使用字符串构造按钮使用字符串构造按钮 2.2.把按钮添加到面板把按钮添加到面板 3.3.用适当的颜色构造一个监听器用适当的颜色构造一个监听器 4.4.注册动作监听器注册动作监听器void makeButton(String name , color bcolor)JButton button=new JButton(name); add(button); Coloraction act=newColoraction(bcolor); button.addActionListener(act); 设计一个方法用来构造按钮:设计一个方法用来

45、构造按钮:四四. .用匿名类简化程序用匿名类简化程序ButtonPanel构造器变为:构造器变为:makeButton(“yellow”,Color.yellow);makeButton(“blue”,Color.blue);makeButton(“red”,Color.red);进一步简化,把进一步简化,把ColorActionColorAction改写成匿名类改写成匿名类void makeButton(String name ,color bcolor)JButton button=new JButton(name); add(button);注册监听器的方法注册监听器的方法nbutton

46、.addActionListener(button.addActionListener(n new ActionListener()new ActionListener()n public void actionPerformed(public void actionPerformed(n actionEvent event) actionEvent event)n setBackground(bcolor); setBackground(bcolor);n repaint() repaint()n n ););n n例例5.65.6 NonameTest.javaNonameTest.jav

47、a四四.用匿名类简化程序(内部类)用匿名类简化程序(内部类)5.2.2 事件类 nJava将事件类大致分成两种:n语义事件(semantic events)与底层事件(low-lever events)。其中语义事件直接继承自其中语义事件直接继承自AWTEvent,如,如ActionEvent、AdjustmentEvent与与ComponentEvent等等,等等,底层事件则是继承自底层事件则是继承自ComponentEvent类,如类,如ContainerEvent、FocusEvent、WindowEvent与与KeyEvent等等。等等。表表5-4显示了常用的事件类、事件监听接口与事显

48、示了常用的事件类、事件监听接口与事件监听接口提供的方法。件监听接口提供的方法。5.2.2 事件类(续)5.2.2 事件类(续)5.2.2 事件类(续)5.2.3 ActionEvent类nActionEvent事件类是组件的事件处理常用类。当点击按钮、选择菜单项目、或向单行文本框输入字符串并敲击Enter键时,都会发生ActionEvent事件。nActionEvent类提供了如表5-5所示的几个方法。 npublic class Jpro4_19 extends JFramen implements ActionListenern n Container cp =getContentPane

49、();n JButton btn1=new JButton(按钮一按钮一);n JButton btn2=new JButton(按钮二按钮二);n JButton btn3=new JButton(退出退出);n JLabel lab=new JLabel(键入键入Enter后文本框内容:后文本框内容:);n JTextField txt=new JTextField(,20);n public Jpro4_19()n super(Action Event);n btn1.addActionListener(this);n btn2.addActionListener(this);n btn

50、3.addActionListener(this);n txt.addActionListener(new ActionListener()n public void actionPerformed(ActionEvent e)n lab.setText(键入键入Enter后文本框内容后文本框内容:+txt.getText();); 例5.7 ActionEvent事件类的处理 cp.setLayout(new FlowLayout(FlowLayout.CENTER);n cp.add(lab);n cp.add(txt);n cp.add(btn1);n cp.add(btn2);n cp

51、.add(btn3);n setSize(260,140); n setVisible(true); n public static void main(String args)n Jpro4_19 frm=new Jpro4_19(); n npublic void actionPerformed(ActionEvent e)n JButton btn=(JButton)e.getSource();n if(btn=btn1) txt.setText(按钮一被按下);n else if(btn=btn2) txt.setText(按钮二被按下);n else System.exit(0);n

52、 n例5.7 ActionEvent事件类的处理例5.7 ActionEvent事件类的处理n在文本框中输入内容并单击Enter键时,文本框内容显示在标签中,如果点击“按钮一”,文本框将显示“按钮一被按下”,点击“退出”按钮,程序将结束。 图图5-5 Actionepent类类5.2.4 KeyEvent类nKeyEvent类继承自InputEvent类,是属于低层次的事件类,只要在键盘上按下任何键,都会触发按键事件。虚拟键代码:虚拟键代码:VKVK键名键名例如:例如:VKVKA A代表代表A A键键VKVK0 0代表代表0 0键键KeyEvent类中的常用方法如表类中的常用方法如表5-61用

53、KeyListener接口处理KeyEvent事件 n用KeyListener接口处理KeyEvent事件KeyListener接口声明了三个方法,如表5-7所示。例例5-8:键盘事件程序键盘事件程序 Jpro4_20.java 例5.8 用KeyListener接口处理KeyEvent事件npublic class Jpro4_20 extends JFrame implements KeyListenern JTextField txf=new JTextField(14);n JLabel lab1=new JLabel(未按键盘);n JLabel lab2=new JLabel(未按

54、键盘);n JLabel lab3=new JLabel(未按键盘);n int keyCode;n Container cp =getContentPane(); n public Jpro4_20()n super(Key Event);n cp.setLayout(new GridLayout(4,1);n txf.addKeyListener(this);n cp.add(txf);n cp.add(lab1);n cp.add(lab2);n cp.add(lab3);n setSize(200,150); n setVisible(true); 例5.8 用KeyListener接

55、口处理KeyEvent事件npublic static void main(String args)n Jpro4_20 frm=new Jpro4_20(); n npublic void keyReleased(KeyEvent e) npublic void keyPressed(KeyEvent e)n keyCode=e.getKeyCode();npublic void keyTyped(KeyEvent e)n lab1.setText(按键代码:+keyCode);n lab2.setText(按键名称:+e.getKeyText(keyCode);n lab3.setText

56、(按键字符:+e.getKeyChar(); n n 例5.8 用KeyListener接口处理KeyEvent事件(续)n当在文本框中按下键盘时,KeyEvent事件将被触发,窗口对象监听到之后,KeyListener接口定义的三个方法将会执行。图图5-6 使用使用KeyListener接口来处理接口来处理KeyEvent事件事件nint getModifiers()返回一个整数,它返回一个整数,它的个位说明了的个位说明了SHIFT、CONTROL、ALT状态状态nboolean isAltdown()nboolean isControlDown()nboolean isMetaDown()

57、nboolean isShiftDown()InputEvent常用方法常用方法n例:复合键的测试例:复合键的测试n int ketcode=event.getKeyCode();n if(keycode=keyEvent.VK_RIGHT&n event.isShiftDown()n. InputEvent常用方法常用方法键盘事件的例子n例例5.10打字训练器打字训练器TypingApplication.javan例例5.11画线程序画线程序Sketch.javaSketch.java2以KeyAdapter类事件处理KeyEvent事件nKeyAdapter类是使用类是使用KeyL

58、istener接口定义的一接口定义的一个类,在类里对个类,在类里对KeyListener接口里的方法全部空接口里的方法全部空实现实现KeyListener接口提供了接口提供了3 个事件处理方法,在实现的个事件处理方法,在实现的监听器类里针对每一个方法都要编写处理代码。监听器类里针对每一个方法都要编写处理代码。即使没有作相关的处理,也必须写上这些方法,用起即使没有作相关的处理,也必须写上这些方法,用起来有点不方便。来有点不方便。除了除了KeyListener之外,之外,Java还提供了还提供了KeyAdapter类类来处理来处理KeyEvent事件事件例5.9 以KeyAdapter类事件处理K

59、eyEvent事件 npublic class Jpro4_21 extends JFramen JTextField txf=new JTextField(14);n JLabel lab1=new JLabel(未按键盘);n JLabel lab2=new JLabel(未按键盘);n JLabel lab3=new JLabel(未按键盘);n Container cp =getContentPane(); n public Jpro4_21()n super(Key Event);n cp.setLayout(new GridLayout(4,1);n txf.addKeyListe

60、ner(new KeyLis();n cp.add(txf);n cp.add(lab1);n cp.add(lab2);n cp.add(lab3);n setSize(200,150); n setVisible(true); 例5.9 以KeyAdapter类事件处理KeyEvent事件 npublic static void main(String args)n Jpro4_21 frm=new Jpro4_21(); nclass KeyLis extends KeyAdaptern public void keyPressed(KeyEvent e)n int keyCode=e.getK

温馨提示

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

评论

0/150

提交评论