第6章图形用户界面

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第6章图形用户界面本章内容是JAVAAPI中与GUI(图形用户界面设计)有关的2组类:AWT和SWING,编写Windows风格的程序。本章涉及AWT和SWING许多的类,及其属性、方法,这不是学习的重点,只需对其有大致的了解,需要的时候查阅JDKDOC即可。本章学习的重点是:掌握GUI编程的一般步骤,主要包括GUI界面的构造顺序和事件处理;结合样例程序强化以前学过的类的继承、组成的概念及实际使用;最后,学习编写符合MVC模式要求的GUI程序。6.1AWT组件及其属性类本小节的要点是:(1)基本概念【这些概念教材都给出了答案】什么是AWT?什么是组件?什么是容器?(2)组件类和容器类的继承关系见P143【图6.1】,这个图很重要,要反复看。在GUI界面设计中,要反复用到面向对象的两种最常见的类之间的关系:继承关系和组成(组合)关系,该图说明了常用组件类的继承关系(所有组件类的继承关系可以查阅JDKDOC或上网搜索)。阅读教材“6.1.1AWT组件”。阅读教材P145【例6.1】,从本例中学习到:使用AWT创建一个GUI程序一般需要以下几步:1)首先继承Frame类,创建一个窗体(窗体相当于Windows的窗口)。2)窗体是一个容器,如果将要设计的GUI界面比较复杂,可以再窗体创建几个容器(比如Panel类)的对象,将窗体分割成几个部分。3)向窗体添加菜单、文本框、按钮、树等等组件,这些组件是窗体的“组成部分”,是类的组成关系的使用。这些初始化窗体及组件的工作,一般是在构造方法中完成的。4)在main()或其它方法中实例化窗体。5)大致上,经过以上几步后,一个GUI程序界面就构造好了。6)需要注意的是:本例是需要一行行输入源代码的,这比较麻烦。如果使用MyEclipse或NetBeans等开发环境,提供GUI组件的“所见即所得”拖放操作,有为GUI界面自动写代码的功能,已经掌握了GUI设计原理的专业程序员当然可以依赖这些自动化的工具,但同学们不要这样做,还是要一行行的看代码、输入代码。7)经过上述步骤后,一个GUI界面就完成了,但这个界面是“死”的,还需要添加事件处理,以响应用户的鼠标或键盘等输入,事件处理是本章下一小节涉及的内容。阅读教材“6.1.2布局管理”,本小节讲述了AWT组件几种常见的布局,合理的布局会使组件的安排有条理,并能自动适应窗口大小和位置的变化。本小节内容一般性了解即可。阅读教材“6.1.3颜色和字体”,本小节内容一般性了解即可。6.2事件处理1什么是事件?与一般的控制台程序不同,GUI程序是事件驱动的。当一个GUI程序完成了初始化工作,创建成功后,就开始“等待”----等待键盘鼠标等操作,然后做出相应的反应。一个GUI窗体有很多组件,这些组件都可以响应键盘鼠标的操作,当操作发生时(比如鼠标点击了一个按钮组件,或文本框组件输入了文字,或点击了窗口的关闭图标),就发生了一个“事件”。事件,就是由于外界操作而引发的(某个或某些)组件的状态的改变,外界操作常见的是鼠标键盘,但不仅限于鼠标键盘。当事件发生时,往往需要程序员写一段程序去响应事件,这种程序叫“事件处理程序”,它一般首先判断哪个组件发生了事件,发生了何种事件,然后按程序设计的要求做出合适的反应。2事件处理程序本章6.1讲解了GUI界面构造的要点,这一部分将介绍编写事件处理程序的要点。两部分合起来就是一个相对完整的GUI程序。事件处理程序的编写有一些特殊的地方,首先看一个简单的事件处理程序。示例1:该程序的界面如下,其功能是:(1)点击“清除”按钮,清除文本框中的数据,(2)点击窗口“关闭”按钮关闭窗口。下面是源程序,重点关注紫色字的部分:importjava.awt.*;importjava.awt.event.*;//导入事件处理包publicclassQueryFrameextendsFrameimplementsActionListener//QueryFrame窗口响应单击事件{privateTextFieldtext;//文本行privateButtonbutton;//按钮publicQueryFrame()//构造方法{super(清除文本框);//窗口标题setBounds(300,240,300,100);//窗口位置和尺寸setBackground(Color.lightGray);//窗口背景色setLayout(newFlowLayout(FlowLayout.LEFT));text=newTextField(10);//实例化文本框add(text);//添加文本框到窗体button=newButton(清除);//实例化按钮add(button);//添加按钮到窗体button.addActionListener(this);//为按钮注册单击事件监听器addWindowListener(newWinClose());//注册窗口事件监听器,委托WinClose类的对象处理事件setVisible(true);//显示窗体}publicvoidactionPerformed(ActionEvente)//单击事件处理方法,实现ActionListener接口{if(e.getSource()==button)//获得当前事件源text.setText();//清除文本框}publicstaticvoidmain(Stringarg[]){newQueryFrame();}}classWinCloseextendsWindowAdapter{publicvoidwindowClosing(WindowEvente)//单击窗口关闭按钮时触发并执行{System.exit(0);//程序结束}}本程序的设计意图是响应两种事件:A.按钮组件button可以响应鼠标单击事件,事件发生后清除文本框。B.窗体组件QueryFrame响应窗体关闭事件,事件发生后关闭窗口退出程序。这两种事件都采用了JAVA的“委托事件处理模型”,所谓委托,是指发生事件的组件(本程序发生事件的组件是按钮和窗体)自已不去处理事件,而是委托给别的对象处理。本例中按钮单击事件委托给本类的事件处理方法actionPerformed()处理,而窗体事件则委托给另一个类WinClose处理。下面分别讨论其操作步骤:A.按钮组件button可以响应鼠标单击事件,事件发生后清除文本框。操作步骤是:声明QueryFrame类实现ActionListener接口,该接口专门用于响应组件的单击事件,包括按钮组件或其它组件。button.addActionListener(this)为按钮注册单击事件监听器,JAVA运行时环境将“后台监听”单击事件的发生。形参this表示该事件将交给本类的单事件处理方法处理。实现ActionListener接口的抽象方法ActionPerformed(ActionEvente),该方法也叫“(单击)事件处理方法,实现该方法是程序员要完成的最主要的工作。当按钮单击事件发生后,后台运行的JAVA“单击事件监视器”(该监视器对程序员不可见)捕获到了该单击事件,自动调用方法ActionPerformed(ActionEvente),形参e的类型是ActionEvent,这是JAVA预定义的一个单击事件类,“单击事件监视器”将自动创建一个该类的对象e作为实参传给该方法。在单击事件处理方法ActionPerformed(ActionEvente)体内,程序员一般首先要写一行if(e.getSource()==button)获得事件源,即那个组件发生了单击事件(可能有多个事件注册了单击事件),然后根据程序的设计要求作相应处理。上面讲解了使用事件处理方法处理按钮组件单击事件的一般步骤,这些步骤实际上是通用的,也就是说,任何一个组件(按钮、文本框…)要使用事件处理方法响应任何事件(鼠标单击、双击、移动,键盘按键…),一般都要进行以下步骤:1)在类的声明中implements要响应的事件接口,JAVAAPI有很多事件接口,每种接口对应一种事件,常见的有:ActionListener单击事件接口MouseListener鼠标事件接口KeyListener键盘事件接口WindowListener窗口事件接口2)为组件注册事件,JAVA运行时环境将“后台监听”注册事件的发生。注册是通过调用组件的add***listener()方法完成的,比如示例1中的:button.addActionListener(this);对于Component组件及其子类组件,常见的事件监听器有:addActionListener()注册单击事件addMouseListener()注册鼠标事件addKeyListener()注册键盘事件对于Window组件及其子类组件,常见的事件监听器有:addWindowListener();3)编写事件处理方法,这是程序员最主要的工作,实际上是实现第1)步所述的事件接口的抽象方法。比如对于“示例1”的ActionListener接口,其抽象方法只有一个:publicvoidactionPerformed(ActionEvente)其它常用的事件接口的抽象方法是:MouseListener鼠标事件接口mouseDragged(MouseEvente)mouseMoved(MouseEvente)KeyListener键盘事件接口keyPressed(KeyEvente)keyReleased(KeyEvente)keyTyped(KeyEvente)WindowListener窗口事件接口一共有9个抽象方法按JAVA语法要求,一旦类声明implement了某个接口,就要实现该接口的所有抽象方法。4)事件处理方法一旦写好,是不需要程序员调用的,而是由“后台运行”的事件监听器在事件发生后自动调用。事件监听器对程序员是不可见的。如果需要的话,程序员也可以自行调用事件处理方法。B.窗体组件QueryFrame响应窗体关闭事件,事件发生后退出程序。其关键的代码是:addWindowListener(newWinClose());注意在窗体事件注册时,方法的参数不是this(this表示本类的事件处理方法),而是newWinClose(),说明窗体事件被委托给另一个类WinClose去处理,在该类中实现事件接口的抽象方法。按JAVA语法要求,一旦类声明implement了某个接口,就要实现该接口的所有抽象方法。WindowListener窗口事件接口有9个抽象方法,一一实现太麻烦,所以JAVA为WindowListener设计了一个适配器类WindowAdapter,只要继承了这个类,只需写程序员需要实现的抽象方法即可,其它抽象方法由WindowAdapter自动实现,如下所示,程序员只需实现windowClosing():classWinCloseextendsWindowAdapter{publicvoidwindowClosing(WindowEvente){System.exit(0);}}从上述A和B两部分的讨论可知,将事件委托给本类的事件处理方法处理和委托给其它类的事件处理方法处理,其步骤基本雷同,主要差别在于事件注册调用add***Listener(参数)方法时,前者用了this作实参,意指“本类对象的事件处理方法”,而后者new了一个其它类的对象。阅读教材“6.2.1委托事件模型”和【例6.2】,它们以单击事件和窗口事件为例,说明了JAVAGUI事件处理的原理和编程步骤。阅读教材“6.2.2AWT事件类和事件监听器接口”,这一小节可以作为AWT事件编程的参考资料使用。1AWT事件类图6.8列出了AWT常见的事件类,这些类可以作为事件处理方法的参数。2AWT事件监听器接口表6-1列出了常见的AWT事件监听器接口及接口的抽象方法,这些抽象方法实现后就是事件处理方法。3事件适配器类说明了窗口事件适配器类的使用。4AWT组件中注册事件监

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功