第11章_编写图形用户界面程序.ppt.ppt.ppt_第1页
第11章_编写图形用户界面程序.ppt.ppt.ppt_第2页
第11章_编写图形用户界面程序.ppt.ppt.ppt_第3页
第11章_编写图形用户界面程序.ppt.ppt.ppt_第4页
第11章_编写图形用户界面程序.ppt.ppt.ppt_第5页
已阅读5页,还剩161页未读 继续免费阅读

下载本文档

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

文档简介

第11章编写图形用户界面程序,教学内容,图形用户界面概述AWT和Swing比较颜色、字体和图形Swing容器和组件使用Swing的基本组件布局管理器事件驱动设计,教学目标,掌握使用Swing编写图形用户界面程序的基本方法准确描述Swing中常用组件的作用及主要方法的功能熟悉应用Swing的基本组件设计图形用户界面通过布局管理器设计窗口布局理解Java的事件处理机制,编写事件驱动程序,11.1GUI概述,图形用户界面(GUI,GraphicsUserInterface)是软件产品与用户交互的接口,是软件产品中用户可以看到并直接操作的部分。如图11-1所示,Java语言集成开发工具JCreator提供了良好的用户界面,使用户编写Java程序变得简单。用户通过图形界面向计算机系统发布命令、控制操作,系统的结果也以图形界面方式显示给用户。,图11-1JCreator的GUI,在Java中,AWT(AbstractWindowingTookit,抽象窗口工具包)是用来处理图形最基本的方式,它可以用来创建Java的applet及窗口程序。AWT是Java早期的技术,提供的组件有限,无法满足应用程序组件多样化的要求。为了弥补这个不足,Sun公司开发出Swing包,它有别于AWT,不依赖于特定的系统平台,对外提供多样化的组件及外观,并且保持外观风格的一致。,11.1GUI概述(续),11.1.1GUI组成元素分类,在Java中,GUI组成元素都放在java.awt和javax.Swing包内,它们都包含了大量的类。构成图形用户界面的各种元素和成份可以粗略地分为三类:容器(container)、组件(components)和用户自定义成份。1容器容器是用来组织或容纳其他界面成份和元素的组件。Java提供了相应的容器类,例如,框架(JFrame/Frame)、面板(JPanel/Panel)及滚动面板(JScrollPanel/ScrollPanel)等类。,2组件与容器不同,组件是图形用户界面的基本单位,里面不再包含其他成份。组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。3用户自定义成份除了上述的标准图形界面元素外,编程人员还可以根据用户的需要,使用各种字型字体和颜色设计一些几何图形、标志图案等,它们被称作用户自定义成份。用户自定义成份通常只起到显示结果、装饰美化的作用,不能响应用户的动作,不具有交互功能。,11.1.1GUI组成元素分类(续),11.1.2AWT和Swing介绍,Sun公司提供了两个图形工具类包AWT和Swing,负责构建GUI界面。AWT是将本地化的工具组件进行简单抽象而形成的。用AWT创建组件和进行事件处理时,都是直接由相应组件进行自身绘制并对事件作出响应。由于AWT的这个特征,这些组件被称为重量级组件,AWT被称为重量级的图形工具。考虑到跨平台的原因,AWT只提供了各个平台都支持的、构建GUI必需的一些基本组件。因此AWT包小而简单。由于AWT直接调用本地图形构件来实现图形界面,使得用AWT构件的GUI往往在不同的操作系统平台上具有不同的风格,而且GUI的性能也受到了限制。这影响了Java程序的跨平台性。,Swing不但重写了AWT中的组件,还为这些组件增添了新的功能,提供了许多AWT没有的、创建复杂图形用户界面的组件,增强了GUI与Java程序的交互功能。Swing提供的可插入式的观感能让用户创建出跨平台的GUI。Swing和AWT部分组件的继承关系和层次关系如图11-2所示。,11.1.2AWT和Swing介绍(续),图11-2Swing和AWT部分组件的继承和层次关系,11.1.2AWT和Swing介绍(续),11.1.3颜色、字体和图形,在进行用户界面设计时,经常会用到Color类、Font类和Graphics类,分别用来设置颜色、字体和图形,这三个类属于java.awt包,同样可以在创建Swing界面时使用。1Color类Color类用于封装默认sRGB颜色空间中的颜色,或者用于封装由ColorSpace标识的任意颜色空间中的颜色。Color类中已经创建了一些常见的颜色对象,包括BLACK、BLUE、CYAN、GRAY、GREEN、MAGENTA、ORANGE、PINK、RED、WHITE等,这些颜色对象可以直接使用。当然,也可以通过Color类的构造方法来创建颜色。表11-1列出了Color类的构造方法。,11.1.3颜色、字体和图形(续),比如,要使用一个红色对象,下面几种方法都可以实现:Color.redColor.REDnewColor(255,0,0)newColor(1.0,0.0,0.0),11.1.3颜色、字体和图形(续),2Font类Font类是用来规范组件所用文字的字体、大小和样式等。Font类提供了一个构造方法Font(),一个设置字体的成员方法setFont(),以及若干个获取字体有关信息的成员方法。要设置一个字体,可以使用Font()构造方法实现:Font(Stringfontname,intstyle,intsize)其中,fontname为字体名,如宋体、黑体、楷体、Arial、Courier、TimesRoman、Helvetica等;style为字体样式,如粗体(BOLD)、斜体(ITALIC)、正常体(PLAIN);size为用像素点表示的字体大小。,11.1.3颜色、字体和图形(续),3Graphics类Graphics类是所有图形上下文的抽象基类,允许应用程序在组件上进行图形绘制。由于不能直接创建对象,一般通过以下两种方法获得该对象:调用paint()或update()方法,系统自动获取当前界面的Graphics对象作为参数传递给GUI程序;调用Component类的getGraphics()方法。比如,想在窗口中绘制一个矩形,下面的语句就可以实现。Graphicsg=frame.getGraphics();g.drawRect(30,60,140,40);,11.1.3颜色、字体和图形(续),第一条语句是取得窗口的绘图区,第二条语句是绘制长方形。但是,当用其他窗口覆盖这个窗口,或者将窗口最小化时,绘制出来的图形也会随之覆盖或者消失。为了避免这种情况,AWT提供了一个自发性的paint()方法。paint()方法在下列情况发生时,会自动运行:1当新建的窗口显示在显示器上,或从隐藏变成显示时;2从缩小图标还原之后;3正在改变窗口的大小时。,11.1.3颜色、字体和图形(续),paint()方法的格式是:publicvoidpaint(Graphicsg)可以将Graphics对象传给paint()方法,这样一来,编写在paint()里面的程序代码便可在绘图区内绘制图形了。上面的绘图代码就可以进行改写,将绘制矩形的代码放在paint()方法里面,程序通过调用paint()进行绘图。Graphicsg=frame.getGraphics();paint(g);g.drawRect(30,60,140,40);第二条语句是调用paint()方法在指定的组件上进行绘图,第三条语句应写在paint()方法内,绘制长方形。,11.1.3颜色、字体和图形(续),例111AWT绘图示例,程序运行如图11-3所示。paint()方法在窗口创建的时候就可以自动运行,首先设置了颜色和字体,利用设置好的条件在获取的绘图区域绘制了一个矩形,并且绘制了一串文字。Graphics类是从java.lang.Object类派生而来,定义了很多绘制图形的方法。这些方法与Color类和Font类结合,就能绘制出不同颜色的图形以及在图形中绘制各种文字符号。,图11-3AWT的绘图,例111AWT绘图示例(续),类Graphics的常用方法,类Graphics的常用方法(续),注意,上面的所有方法只要涉及到坐标,均是以窗口的左上角为原点,向右为正x方向,向下为正y方法。,11.1.4使用AWT创建图形用户界面,使用AWT构建一个图形用户界面的基本步骤一般包括以下几步:创建容器组件(如Frame、Panel等),在容器中添加需要的其他组件(如Button、Label、TextField和Checkbox等)。创建布局管理器,用来自动设置容器中组件的位置和大小。使用委派事件模型来响应用户操作,实现用户和程序的交互。AWT中各种基本组件类如表11-3所示。,AWT基本组件,AWT创建图形用户界面示例,例112显示一个数字验证窗口,并通过信息显示是否输入正确。,AWT创建图形用户界面示例(续),运行结果如图11-4所示。,图11-4AWT窗口示例程序,程序分析:这个例子中,在类Jpro11_2里面定义一个Frame窗口对象,该容器同时也实现了事件监听器功能。在该窗口类中定义了五个静态的对象,分别是两个Label标签对象:tip和result,tip起到提示操作的功能,result显示操作的结果;两个TextField文本框对象:sys和user,sys显示了系统自动产生的数字,user供用户输入信息;还有一个Button按钮对象submit,供用户输入后提交答案;这些均是AWT基本组件。setBounds()、setVisible()等方法用来改变窗口对象的状态,具体见下节。add()方法通常用于将一些基本组件加入到容器里面。本程序还涉及到了布局管理和事件驱动设计,AWT和Swing在这两部分基本是相同的,这两部分内容在本章后面将详细说明。,AWT创建图形用户界面示例(续),11.2Swing容器,Swing工具包中提供了三类容器组件,分别是:1顶层容器:JFrame、JDialog、JApplet、Jdialog,这四个组件是Swing库中仅有的重量级容器;2中间容器:JPanel、JScrollPane、JSplitPane、JTabbedPane和JToolBar,用于容纳其他组件,但需要放置在顶层容器中。3特殊容器:在GUI上起特殊作用的中间层,如JInternalFrame、JLayeredPane、JRootPane。,11.2Swing容器(续),与AWT容器不同,Swing组件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(JContentPane)上。内容面板是顶层容器包含的一个普通容器,它是一个轻量级组件。,图11-5Swing容器层次结构,11.2.1简单的窗口对象示例,例113显示一个红色的窗口,窗口的中间显示“红色的窗口”字符串。,运行结果如图11-6所示。程序分析:这个例子中,在类Jpro11_3里面定义了一个JFrame窗口对象,属于Swing的顶级容器。通过setLocation()、setSize()、setBounds()等方法来改变窗口对象的状态,在Java的早期版本中,显示窗口一般使用show()方法,现在多用setVisible()方法来设置窗口的显示。对于这个窗口,可以使用最大化按钮、最小化按钮、拖拽边框来改变窗口的大小。,图11-6Swing窗口示例程序,11.2.1简单的窗口对象示例(续),11.2.2Swing窗口对象,通过上面的例子,我们大体上理解了窗口程序的设计过程。在Jpro11_3.java中,使用了Swing中的窗口组件JFrame类,它属于javax.swing类库。javax.swing类库提供的部分容器类以及它们之间的继承关系如图11-7所示。从图11-7可以看出,除了四个顶层容器之外,容器类都是JComponent类的子类。而JComponent类是Container类的子类,所以在Component类和Container类中定义的方法,在Swing的容器类中都可以使用。比如,Jpro11_3.java中jf对象使用的setSize()、setBackground()、setLocation()与setVisible()方法都是在Component类中定义的,add()方法则是在Container类中定义的。,图11-7javax.swing容器的继承关系图,11.2.2Swing窗口对象(续),11.2.2Swing窗口对象(续),表11-4提供了Component类常用的方法,关于Component完整的信息请参考JavaAPI文档。,11.2.2Swing窗口对象(续),GUI设计中另一个重要的类是Container类,它派生自Component类。Container类创建的对象可以容纳由Component类所创建的对象。下面是Container类常用的方法。,11.2.2Swing窗口对象(续),11.2.2Swing窗口对象(续),11.2.3窗口JFrame,在例11.3中,使用了JFrame类来创建窗口。JFrame类继承自java.awt.Frame类,带有边框、标题栏及用于关闭和最大/最小化窗口的图标,用来容纳按钮、文本框等其他窗口组件。当然,也可以容纳其他容器对象。表11-6列出JFrame类的构造方法与常见方法。,表11-6中的MenuBar类用来创建菜单,在本章的后面将会介绍。,11.2.3窗口JFrame(续),通过setDefaultCloseOperation(intoperation)方法可以设置窗口的关闭行为,参数的取值有以下四种:1DO_NOTHING_ON_CLOSE:不执行任何操作;要求程序在已注册的WindowListener对象的windowClosing()方法中处理该操作。2HIDE_ON_CLOSE:调用任意已注册的WindowListener对象后自动隐藏该窗体。3DISPOSE_ON_CLOSE:调用任意已注册WindowListener的对象后自动隐藏并释放该窗体。4EXIT_ON_CLOSE:使用System.exit()方法退出应用程序。默认情况下,该值被设置为HIDE_ON_CLOSE。,11.2.3窗口JFrame(续),对JFrame添加组件有两种方式:1用getContentPane()方法获得JFrame的内容面板,再对其加入组件:jframe.getContentPane().add(childComponent)2建立一个JPanel之类的中间容器,将组件添加到容器中,用setContentPane()方法将该容器置为JFrame的内容面板:JpanelcontentPane=newJpanel();/把其它组件添加到Jpanel中;jframe.setContentPane(contentPane);/把contentPane对象设置成JFrame的内容面板,11.2.3窗口JFrame(续),例114创建一个窗口,程序分析:程序创建了一个JFrame类对象jf,创建时调用了设置标题的构造方法JFrame(Stringtitle)。然后,获取内容面板cp,通过在cp中添加JLabel的对象jl的方式,把标签放入窗口。最后,分别通过setBounds()方法、setVisible()方法设置窗口大小、位置和显示窗口。,图11-8JFrame示例程序,例114创建一个窗口(续),11.3Swing基本组件,Swing包中包含很多基本组件,下面分别介绍其中几个常用组件。,11.3.1JLabel组件,标签(JLabel)是用来在窗口中显示文字的文本框,也是在屏幕上显示图像或文本的一种最简单和快捷的方式。表11-7给出了类JLabel常用的构造方法与方法。,11.3.1JLabel组件(续),例115创建标签,程序分析:程序中,创建了一个标签对象,分别使用setBackground()方法和setForeground()方法设置标签的背景和前景颜色。,图11-9标签对象的创建,例115创建标签(续),11.3.2JButton组件,按钮是交互式界面常用的组件,用户可以通过点击按钮控制程序的运行。表11-8给出了JButton类常用的构造方法与方法。,例116创建按钮,例116创建按钮(续),程序分析:程序中创建了2个按钮对象,获取JFrame类对象jf的内容面板cp后,通过cp的add()方法按钮添加入窗口。程序中出现的setLayout()方法是用来设置窗口内组件的布局方式的。按钮对象的setBounnds()方法是在Component类中定义的,作用是设置组件的位置和大小。,图11-10按钮对象的创建,11.3.3JTextField与JTextArea组件,Swing中用来处理文字输入组件的类主要有两个,JTextField与JTextArea。JTextField用来处理单行文字,而JTextArea可以做多行文字处理。这两个类都继承自JTextComponent类。JTextComponent里提供了不少常用的方法,表11-9给出了部分方法。,11.3.3JTextField与JTextArea组件(续),1.文本框,文本框(JTextField)是Swing包中最基本的文字处理组件,它可以显示输入单行文字,类JTextField常用的构造方法与方法如表11-10所示。用JTextField()构造方法创建文本框时,除了设置初始字符串之外,还可以设置文本框的宽度。例如,JTextFieldtxf=newJTextField(初始字符串,20);/能容纳20个字符的文本框,1.文本框(续),例117文本输入框的使用,程序分析:程序中使用了3个文本框。其中第一个文本框使用方法setEditable()设置成不可编辑,第三个文本框是一个JPasswordField对象,编辑一个单行文本,但不显示原始字符。而把里面的输入字符显示成“*”。与AWT中的TextField不同,JTextField不具有设置掩饰字符的功能,而是由其子类JPasswordField类实现。,例117文本输入框的使用(续),图11-11文本框对象的创建,2文本域,文本域(JTextArea)可以呈现多行文字,可以设置自动换行的功能,但不管理滚动。它实现了Swing的Scrollable接口,因此可以把它放置在JScrollPane的内部,通过JScrollPane来设置垂直或水平滚动条。表11-11给出了类JTextArea常用的构造方法与方法。,2文本域(续),例118文本域的使用,程序分析:程序中,产生一个8行14列的文本框,这个文本框带有垂直滚动条,可以在单词边界进行自动换行,所以不显示水平滚动条。,例118文本域的使用(续),图11-12文本域对象的创建,11.3.4JCheckBox组件,选择框可以让用户选取项目,通常分为复选和单选两种。复选表示多个选项可以同时选择,而单选表示一组选项中只能选择一项。Swing中提供了JCheckBox类来实现复选功能。表11-12给出了JCheckBox类常用的构造方法与方法。,下面的例子创建了三个复选框对象。通过构造方法,将两个复选框的状态设置为选中状态。,11.3.4JCheckBox组件(续),例119复选框的使用,例119复选框的使用(续),图11-13复选框的创建,11.3.5JRadioButton组件,Swing中实现单选操作非常简单,只要将几个JRadioButton对象加入到一个ButtonGroup群组对象就可以了。ButtonGroup类用于为一组按钮创建一个多斥(multiple-exclusion)作用域。使用相同的ButtonGroup对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮。表11-13给出了类JRadioButton的构造方法,它的常用方法与JCheckBox基本相同。表11-14给出了类ButtonGroup的构造方法和方法,11.3.5JRadioButton组件(续),例1110单选按钮的使用,图11-14单选框的创建,11.4布局管理器,前面课程的学习中,经常会发生这样的情况,当将很多的组件放在容器里面的时候,这些组件摆放将很凌乱,有时候甚至看不见部分组件。这是因为没有对这些组件进行布局管理。每个容器对象都有一个默认的布局管理器,它是一个实现页面布局管理类的实例,布局管理器可以由setLayout()方法设定。如果容器没有调用setLayout()方法,那么默认的布局管理器就将被使用。每当容器初次显示或进行大小调整时,布局管理器都会自动布置它里面的组件并将组件调整为最佳大小。,11.4布局管理器(续),Java提供了多种布局类来对容器页面进行管理,常用的有以下5个,它们均直接继承自java.lang.Object类,虽然属于java.awt包,但也是Swing中常用的布局类。这些布局类之间的关系如图11-15所示。,图11-15布局管理器相关类,11.4.1FlowLayout,FlowLayout是JPanel容器及其子类的默认布局管理器,它按照从上到下、从左到右的规则,将添加到容器中的组件依次排列。当一行的空间用完后,便从新的一行开始存放。FlowLayout类提供了如表11-15所示的几个构造方法。在创建FlowLayout对象时,可以指定一行中组件的对齐方式,默认为居中,构造方法可以接受FlowLayout.LEFT和FlowLayout.RIGHT两个参数,使组件左或右对齐。比如可以使用用下面的代码使组件右对齐。setLayout(newFlowLayout(FlowLayout.RIGHT);,11.4.1FlowLayout(续),例119FlowLayout布局管理器的使用,当拖动窗口的边界改变窗口大小时,将会发现窗口里面的组件也随着窗口大小而改变位置,组建的布局有流动式特征,这也是FlowLayout布局的特点。比如将图(a)向右拖动放宽,则布局如图11-16(b)所示。,例119FlowLayout布局管理器的使用(续),(a)(b)图11-16FlowLayout布局管理器,11.4.2BorderLayout,BorderLayout是Windows及其子类的默认布局管理器,它将容器分为5个部分,分别命名为NORTH、SOUTH、WEST、EAST和CENTER。BorderLayout类提供了如表11-16所示的几个构造方法。,例1112BorderLayout布局管理器的使用,例1112BorderLayout布局管理器的使用(续),如果容器使用BorderLayout类对象作为布局管理器,添加任何一个组件都将以边界作为参照。比如,cp.add(but1,border.EAST);就是在容器cp的最左端添加一个组件but1。,图11-17BorderLayout布局管理器,11.4.3GridLayout,GridLayout是一种很容易理解的布局管理器,它将容器按照指定的行数、列数分成大小均匀的网格,然后将添加到容器里面的组件一一放入。GridLayout类提供了如表11-17所示的几个构造方法。,例1113GridLayout布局管理器的使用,例1113GridLayout布局管理器的使用(续),程序分析:由于使用GridLayout布局管理器的容器里添加的组件大小完全相同,所以经常将界面中具有这种特点的组件放入一个新的容器里面,使用GridLayout进行布局,然后再将这个容器添加到界面容器里面。当实际产生的组件少于网格定义数时,布局对象会按照保持行数不变的原则进行自动调整。,图11-18GridLayout布局管理器,11.4.4CardLayout,CardLayout是一种将每个组件看作一张卡片,且将所有卡片码成一摞,每一时刻只有一张卡片被显示的布局管理器。有人将其形象地描述为一副落成一叠的扑克牌。第一个添加到容器中的组件位于最低层,最后一个添加到容器中的组件位于最上层。CardLayout类提供了如表11-18所示的几个构造方法和方法。,11.4.4CardLayout(续),11.4.5GridBagLayout,GridBagLayout生成的布局管理器也是和GridLayout一样是使用网格来进行布局管理的。所不同之处在于GridBagLayout可以通过类GridBagConstraints来控制布局容器内各组件的大小,每个组件都使用一个GridBageConstraints对象来给出它的大小和摆放位置,这样就可以按照设计者的意图,改变组件的大小,把它们摆在设计者希望摆放的位置上。这种灵活性是前面几个布局管理器所不具备的。有关GridBageLayout布局管理器使用的详细情况参阅JDK帮助文档。除了以上五种布局类,Swing还为它的容器提供了其他一些布局管理器,如BoxLayout、DefaultMenuLayout、ScrollPaneLayout等,这里不进行介绍,可查阅Sun公司提供的API文档进行深入学习。,11.4.6容器的嵌套,在本章前面的范例中,都是把组件放在窗口对象的内容面板内,窗口和内容面板都是容器,用来存放其他组件。在实际应用中,可能将一个容器分成很多小块,每一块包含几个组件,这些组件用一个中间容器来存放,然后再将这些中间容器添加到外部容器对象中。Swing中提供了多种中间容器,可以在一个容器中添加几个中间容器对象,每个中间容器对象都可以指定不同的布局方式。下面就以JPanel容器为例来说明容器的嵌套使用。,例1114容器嵌套的使用,例1114容器嵌套的使用(续),程序分析:程序中,将大小相同的12个按钮组件添加在一个JPanel对象里面,使用GridLayout进行布局,然后再将这个JPanel对象添加到顶层容器JFrame对象的内容面板ContentPane中。,图11-19容器的嵌套,布局管理器使用注意,我们既可以在程序中安排组件的位置和大小,也可以通过布局管理器安排,这两种情况可能会发生冲突,因此,同时使用时要注意以下两点:1容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java语言提供的setLocation(),setSize(),setBounds()等方法,则都会被布局管理器覆盖。2如果用户确实需要自行设置组件大小或位置,则应取消该容器的布局管理,方法为:setLayout(null);,11.5事件驱动设计,在窗口程序设计时,事件(event)的设计是不可或缺的一块。当按下按钮时,也就触发了相应的事件,这个事件由程序代码来做判断与决定。前面已经掌握如何绘制一个图形用户界面,但是还不能执行用户交互的操作。而Java的事件处理机制,能够实现用户与应用程序交互的功能。,11.5.1委托事件模型,Java事件处理机制涉及三个非常重要的概念:事件源、事件和事件监听器(也称作事件处理者)。事件源是指产生事件的对象,如容器、按钮等。事件:用于在事件源与事件监听器间传递信息的对象。监听器:能够接收事件源通知的对象。,事件处理机制的思想是:当事件源收到用户发出的操作指令后产生相应的事件,然后将这些事件分别发送给不同的监听器,由监听器来处理这些事件,并将处理结果返回。整个过程中,监听器简单的等待,直到它收到一个事件。这种事件处理机制使得处理事件的应用程序逻辑与生成事件的界面逻辑(容器或者组件)彼此分离,相互独立存在。在Java中,事件处理机制中的事件、事件源和事件监听器,均以类的形式存在,这些类构成了整个Java事件处理机制的核心。为了更好的理解这些概念以及机制本身,下面通过一个例子说明。,11.5.1委托事件模型(续),例1115事件处理程序,例1115事件处理程序(续),程序运行结果如图11-20(a)所示,单击窗口中的按钮,窗口的背景将变成黄色,同时窗口的标题也被改变为“事件处理机制”。,(a)(b)图11-20事件处理机制,基本概念,事件源:本例中,按钮对象就是一个事件源。也就是事件发生的场所,通常就是各个组件。事件:本例中,当按下按钮时,就产生了一个事件类ActionEvent的对象e,它是用户对界面操作在Java语言上的描述。它由用户和界面中的组件交换而产生,比如移动鼠标、点击鼠标按钮和按下键盘键等都可以引发事件。监听器:本例中,为了使窗口对象能够监听按钮触发的事件,让Jpro11_15对象实现事件处理的接口。Java使用一组接口来实现对事件源的监听。,监听器的使用,那么选择谁来担任监听呢?在层次事件模型中,当一个事件对象产生后,首先传递给直接相关的组件,该组件可以对事件进行处理,也可以忽略事件不做处理。如果组件没有对事件进行处理,则事件处理系统会将事件继续向上传递给组件所在的容器。同样,容器可以对事件处理,也可以忽略不处理。如果事件又被忽略,则事件处理系统会将事件继续上传,依次类推,直到事件被处理,或是传到顶层容器。如本例中,内容面板容器没有对按钮事件进行处理,而是交由顶层窗口容器进行处理。,当事件发生时,由事件处理接口处理事件。事件处理接口提供了一定的事件处理方法。本例中,当窗口对象监听到按钮ActionEvent类事件后,就交给事件处理者窗口调用actionPerformed()方法进行事件处理。本例中,选择了窗口作为监听者。事实上也可以自定义一个类来实现ActionListener接口,再把此类产生的对象作为监听。通常把实现接口的类定义在主类里,成为主类的内部类。按照这种思路,可以把上面的例子改成例11.16。,监听器的使用(续),例11.16使用内部类来监听事件,例11.16使用内部类来监听事件(续),程序分析:程序通过内部类实现事件处理的功能。内部类是在类的内部进行声明的类,它自动拥有对其外部类所有成员(方法、属性)的访问权。因为这一特点,在编写GUI程序时,常常使用它进行事件处理。在对多个相似事件源进行监听时,可以使用多个内部类分类型的进行事件监听,实现相同事件的不同处理过程,即避免过多的分支语句导致程序过长,又可以明确划分组件功能。对于只使用一次在某个事件源上进行注册的监听器,也常常在注册时创建一个匿名的内部类,完成事件处理,如语句btn.addActionListener(newActionListener()publicvoidactionPerformed(ActionEvente)/事件处理代码);可以完成对btn上的ActionEvent事件处理。,11.5.2事件类,Java将事件类大致分成两种:语义事件(semanticevents)与底层事件(low-leverevents)。其中语义事件直接继承自AWTEvent,如ActionEvent、AdjustmentEvent与ComponentEvent等等,底层事件则是继承自ComponentEvent类,如ContainerEvent、FocusEvent、WindowEvent与KeyEvent等等。表11-19显示了常用的事件类、事件监听接口与事件监听接口提供的方法。,11.5.2事件类(续),11.5.2事件类(续),11.5.2事件类(续),11.5.3ActionEvent类,ActionEvent事件类是组件的事件处理常用类。当点击按钮、选择菜单项目、或向单行文本框输入字符串并敲击Enter键时,都会发生ActionEvent事件。ActionEvent类提供了如表11-20所示的几个方法。,例1117ActionEvent事件类的处理,例1117ActionEvent事件类的处理(续),在文本框中输入内容并单击Enter键时,文本框内容显示在标签中,如果点击“按钮一”,文本框将显示“按钮一被按下”,点击“退出”按钮,程序将结束。,图11-21Actionepent类,程序分析:类Jpro11_17继承自JFrame,cp对象是内容面板容器。当按下按钮时,将会发生ActionEvent类事件,按钮本身不作任何处理,这时候就会把事件向上传递,直到窗口对象frm监听到为止。当frm对象监听到按钮事件后,就会运行ActionListener接口提供的方法actionPerformed(ActionEvente)。由于ActionEvent类继承自EventObject类,所以可以使用EventObject类提供的方法getSource()来查看是哪个对象激活的事件。程序在类Jpro11_17中通过实现ActionListener接口定义了一个匿名内部类,文本框组件txt向该匿名内部类对象注册监听。,例1117ActionEvent事件类的处理(续),11.5.4KeyEvent类,KeyEvent类继承自InputEvent类,是属于低层次的事件类,只要在键盘上按下任何键,都会触发按键事件。要处理KeyEvent事件,可以用KeyListener接口来承担监听。但是KeyListener接口提供的事件处理方法较多,在实现的类里针对每一个方法都要编写处理代码。即使没有作相关的处理,也必须写上这些方法,用起来有点不方便。除了KeyListener之外,Java还提供了KeyAdapter类来处理KeyEvent事件。,1用KeyListener接口处理KeyEvent事件,用KeyListener接口处理KeyEvent事件,必须用类实现KeyListener接口,然后用这个类对象来监听KeyEvent事件。KeyListener接口声明了三个方法,如表11-22所示。,例1118用KeyListener接口处理KeyEvent事件,例1118用KeyListener接口处理KeyEvent事件(续),当在文本框中按下键盘时,KeyEvent事件将被触发,窗口对象监听到之后,KeyListener接口定义的三个方法将会执行。,图11-22使用KeyListener接口来处理KeyEvent事件,2以KeyAdapter类事件处理KeyEvent事件,Java提供的KeyAdapter类,处理KeyEvent事件时更加方便。KeyAdapter类事实上只是用KeyListener接口定义了一个类,类方法里面没有任何语句,因此可以继承这个类。,例1119以KeyAdapter类事件处理KeyEvent事件,例1119以KeyAdapter类事件处理KeyEvent事件(续),程序分析:程序中,类Jpro11_19里定义了一个内部类KeyLis,用这个内部类的对象去监听KeyEvent事件。在内部类KeyLis中,定义了方法keyPressed()方法,这个方法覆盖了父类KeyAdapter类中的方法keyPressed()。,图11-23使用KeyAdapter类来处理KeyEvent事件,当在文本框中按下键盘时,KeyEvent事件将被触发,KeyLis内部类对象监听到之后,keyTyped()方法将会执行。,11.5.5MouseEvent类,鼠标事件类MouseEvent也继承自InputEvent类,属于低层次事件类的一种,只要鼠标的按钮按下、鼠标指针进入或移出事件源、移动或拖拽鼠标,都会触发鼠标事件。MouseEvent提供了如表11-23所示的方法。,同KeyEvent事件一样,可以使用多种方法来处理MouseEvent事件。Java提供了MouseListener接口和MouseMotionListener接口作为MouseEvent事件的监听。为了方便操作,还提供了MouseAdapter类和MouseMotionAdapter类来处理MouseEvent事件,它们分别对MouseListener接口和MouseMotionListener接口进行实现。,11.5.5MouseEvent类(续),1用MouseListener接口来处理MouseEvent事件MouseListener接口声明了5个用来处理不同事件的方法,如表11-24所示。,11.5.5MouseEvent类(续),2用MouseMotionListener接口来处理MouseEvent事件MouseMotionListener接口用来监听鼠标的移动和拖拽操作,事件源使用addMouseMotionListener()方法来注册监听。MouseMotionListener接口声明的方法如表11-25所示。3用MouseAdapter类事件处理MouseEvent事件为了方便操作,Java为MouseListener接口定义了MouseAdapter类。,11.5.5MouseEvent类(续),例1120用MouseListener和MouseMotionListener接口来处理MouseEvent事件,例1120用MouseListener和MouseMotionListener接口来处理MouseEvent事件(续),标签和文本框里显示鼠标进行的各种操作。程序分析:程序中,用按钮作为事件源之一,当鼠标进入按钮、按下按钮、释放按钮、离开按钮时都将触发MouseEvent事件。窗口的内容面板也是事件源之一,当鼠标在当前窗口中进行移动和拖拽时,标签中将显示事件触发时的鼠标的位置以及状态。,例1120用MouseListener和MouseMotionListener接口来处理MouseEvent事件(续),图11-24使用MouseListener和MouseMotionListener接口来处理MouseEvent事件,11.5.6WindowEvent类,窗口事件WindowEvent类也属于低层次的事件类。窗口的创建、缩小、关闭、变成非活动窗口等操作都会触发WindowEvent事件。Java提供了WindowListerner接口用于窗口事件的监听。为了简便操作,Java还提供了WindowAdapter类来处理WindowEvent事件。WindowListerner接口中声明了7个处理不同事件的方法,如表11-26所示。,11.5.6WindowEvent类(续),例1121使用WindowListener接口处理WindowEvent事件,例1121使用WindowListener接口处理WindowEvent事件(续),程序分析:点击关闭按钮,窗口将关闭。窗口JFrame中的setDefaultCloseOperation(intoperation)方法也可以设置窗口的关闭行为,如果使用WindowAdapter类来处理WindowEvent事件,需要设置setDefaultCloseOperation()方法的参数为JFrame.DO_NOTHING_ON_CLOSE,否则事件监听的结果是隐藏窗口。,图11-25使用WindowListener接口处理WindowEvent事件,11.6Swing其他组件,11.3节中介绍了常用的Swing基本组件,GUI设计中,使用这些组件还是远远不够的,通常还会使用对话框、滚动条、菜单栏等等。下面将介绍它们的使用方法。,11.6.1JList组件,文本项列表(JList)组件为用户提供一个文本项列表,用户可以选择一个或者多个选项。文本项列表组件的使用方式非常简单,使用JList类的构造方法就可以将选项加入到窗体内。类JList提供的构造方法与方法如表11-27所示。,11.6.1JList组件(续),当用户选取或者取消选取文本项列表中的某个选项时,ListSelectionEvent事件就会被触发。可以使用addListSelectionListener()方法把事件监听向JList类的对象注册,再将事件处理的程序代码编写在valueChanged()方法里。,11.6.1JList组件(续),例1122JList组件的使用,例1122JList组件的使用(续),程序运行结果如图11-26所示。当选择某一选项时,窗口中的标签颜色将相应产生变化。程序分析:本例中,类Jpro11_22实现接口ListSelectionListener,所以Jpro11_22类对象frm就可以用来监听ListSelectionEvent事件。当用户选择某一个选项时,ListSelectionEvent事件对象e将被触发,相应的valueChanged()方法就会执行。使用JList类对象的getSelectedIndex()方法获取哪个选项被选中,根据返回值设置窗口中标签对象lab1的内容。JLIst组件不能通过自身的方法显示滚动块,但可以通过创建滚动面板进行设置,如语句JScrollPanelistScrollPane=newJScrollPane(lst);就可以为lst对象添加一个垂直的滚动块。,图11-26JList组件,11.6.2JComboBox组件,组合框(JComboBox)组件与文本项列表组件类似,提供了多个选项供用户选择。但与文本项列表不同的是,组合框只能选择单一的项目,不能复选,且组合框只能显示一个选项,用户必须按下菜单旁的下拉按钮才能选择某个选项。表11-28列出了JComboBox类的构造方法与方法。,11.6.2JComboBox组件(续),组合框的事件处理使用ItemListener接口作为监听器,当用户选取或者取消选取组合框中的某个选项时,ItemEvent事件就会被触发。可以使用addItemListener()方法把事件监听向JComboBox类的对象注册,再将事件处理的程序代码编写在itemStateChanged()方法里。,11.6.2JComboBox组件(续),例1123JComboBox组件的使用,程序运行结果如图11-27所示。当选择某一选项时,组合框下的标签中将显示相应地区的邮编范围。,例1123JComboBox组件的使用(续),图11-27JComboBox组件,程序分析:本例和例11.22类似,类Jpro11_23由接口ItemListener实现,所以Jpro11_23类对象frm就可以用来监听ItemEvent事件。当用户选择某一个选项时,ItemEvent事件对象e将被触发,相应的itemStateChanged()方法就会执行。使用JComboBox类对象的getSelectedItem()方法获取被选中的选项,根据返回值设置窗口中标签对象lab1的内容,获取选中项也可以使用getSelectedIndex()方法来实现。,例1123JComboBox组件的使用(续),滚动条(JScrollBar)是Swing中常用的组件,方便用户拖拽滚动条来设置数值或滚动画面。表11-29列出了类JScrollBar的构造方法与方法。,11.6.3JScrollBar组件,11.6.3JScrollBar组件(续),滚动条的方向可以设置成水平或垂直,JScrollBar类分别用HORIZONTAL与VERTICAL两个常量来表示。Java为滚动条提供了AdjustmentEvent类进行事件处理,使用的是AdjustmentListener接口。该接口提供

温馨提示

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

评论

0/150

提交评论