• 1. 第11章 图形用户界面
  • 2. 本章学习目标了解图形用户界面的历史及其设计原则。 掌握AWT组件集中的各类组件。 理解AWT事件处理机制。 学会编写常见事件处理程序。 了解Swing组件集及其简单编程。
  • 3. 概述图形用户界面,英文全称为Graphical User Interface,一般习惯简称为GUI。 图形化用户界面大大方便了人机交互,是一种结合计算机科学、美学、心理学、行为学,及各商业领域需求分析的人机系统工程,强调人—机—环境三者作为一个系统进行总体设计。
  • 4. 设计原则用户至上的原则 交互界面要友好 配色方案要合理
  • 5. 主流开发工具集基于Java的图形用户界面开发工具(即组件集)最主流的有三种: AWT Swing SWT/JFace 随Sun的JDK一起发布 源于IBM的Eclipse开源项目
  • 6. AWT组件集 AWT由JDK的java.awt包提供,里面包含了许多可以用来建立图形用户界面(GUI)的类,一般称这些类为组件(component) 图11-1 AWT组件的继承关系图
  • 7. AWT组件集 AWT组件大致可以分为以下三类: (1)容器类组件 (2)布局类组件 (3)普通组件类
  • 8. 容器类组件容器类组件由Container类派生而来,常用的有Frame类和Dialog类,以及Panel类型的Applet类。这些容器类组件可以用来容纳其他普通组件或者甚至是容器组件自身,起到组织用户界面的作用。 容器类组件有一定的范围和位置,并且它们的布局从整体上也决定了所容纳组件的位置 因此,在界面设计的初始阶段,首要考虑的就是容器类组件的布局。
  • 9. 布局组件类 布局类组件是非可视组件,它们能很好地在容器中布置其他可视组件。AWT提供了五种基本的布局方式:FlowLayout、BorderLayout、GridLayout、GridBagLayout和CardLayout等,它们均为Object类的子类,如下图11-2所示。图11-2 布局方式
  • 10. FlowLayout FlowLayout是最简单的一种布局方式,被容纳的可视组件从左向右,从上至下依次排列,若一组件在本行放置不下,就自动排到下一行的开始处,该方式为Panel类和Applet类容器的默认布局方式。 示例11-1源程序
  • 11. BorderLayout BorderLayout布局方式的特点是:将容器划分为“东”“西”“南”“北”“中”五个区。 每个区可以摆放一个组件,因此最多可以在BorderLayout的容器组件中放置五个子组件。 Frame或Dialog容器类组件的默认布局方式。 示例11-3源程序
  • 12. GridLayout GridLayout布局将容器划分为行和列的网格,每个网格单元可以放置一个组件,组件通过add()方法从上到下,从左至右顺序加入网格各个单元中 GridLayout布局允许在组件之间设置水平和垂直间距,间距同样以像素为单位表示,如下为创建6行6列,水平间隔和垂直间隔均为10个像素的GridLayout布局对象: setLayout(new GridLayout(6,6,10,10));示例11-4源程序
  • 13. 图11-10 GridLayout布局界面
  • 14. GridBagLayout GridBagLayout是所有AWT布局管理方式中最繁的,同时也是功能最强的。 GridBagLayout设置的所有行和列可以大小不同。 GridBagLayout允许不同组件在容器中占据不同大小的矩形区域。 GridBagLayout由一个专用的类来对布局行为进行约束,该类为GridBagConstraints,它的所有成员都是public(公有)的,要掌握如何使用GridBagLayout布局,关键在于熟悉这些约束变量,以及如何进行设置。
  • 15. GridBagConstraints的常用属性 public girdx //组件所处位置的起始单元格列号 public gridy //组件所处位置的起始单元格行号 public gridheight //组件在垂直方向占据的单元格个数 public gridwidth //组件在水平方向占据的单元格个数 public double weightx //容器缩放时,单元格在水平方向的缩放比例 public double weighty //容器缩放时,单元格在垂直方向的缩放比例 public int anchor //当组件较小时指定其在网格中的起始位置 public int fill //当组件分布区域变大时指明是否缩放,以及如何缩放 public Insets insets //组件与外部分布区域边缘的间距 public int ipadx //组件在水平方向的内部缩进 public int ipady //组件在垂直方向的内部缩进
  • 16. 示例11-5源程序示例11-6源程序
  • 17. CardLayout CardLayout布局将组件(通常是Panel类的容器组件)象扑克牌(卡片)一样摞起来,每次只能显示其中的一张,实现分页的效果,每一页中可以有各自的界面,这样就相当于扩展了原本有限的屏幕区域。 示例11-7源程序
  • 18. CardLayout布局组件提供了以下方法来对各张Card页面进行切换: public void first (Container parent) //显示第一张卡片 public void next (Container parent) //显示下一张卡片 public void previous (Container parent) //显示上一张卡片 public void show (Container parent,String name) //显示指定卡片 public void last (Container parent) //显示最后一张卡片
  • 19. Hint有些Java IDE(如JBuilder)也提供广大编程者所熟悉的基于绝对像素坐标的XYLayout布局方式(用户在此布局方式下可以进行可视化的拖放操作) Java用户界面设计的独到之处恰恰在于其与平台无关的布局方式。 一般不建议采用XYLayout布局,它不但使用起来要依赖于特定的包,还有损Java独立性,不利于程序移植,除非用户认定所编写的程序就只在某特定平台(如Windows)下进行运行。
  • 20. 普通组件 AWT提供了一系列的普通组件以构建用户图形界面,它们主要包括:标签、文本框、文本域、按钮、复选框、单选框、列表框、下拉框、滚动条和菜单等
  • 21. 标签 标签是很简单的一种组件,一般用来显示标识性的文本信息,常被放置于其他组件的旁边起提示作用。 AWT提供的标签类为Label,因此,可以通过创建Label对象来使用标签。 例11-9源程序
  • 22. 文本框 文本框是图形界面中常用于接收用户输入或程序输出的一种组件,它只允许输入或显示单行的文本信息,且用户还可以限定文本框的宽度。 AWT提供的文本框类为TextField,它直接继承于TextComponent,而TextComponent则从Component类继承而来。
  • 23. 关于TextField类的常用方法有: public String getText() //获取文本框中的输入文本 public String getSelectedText() //获取文本框中选中的文本 public boolean isEditable() //返回文本框是否可输入 public void setEditable(boolean b) //设置文本框的状态:可输入或不可输入 public int getColumns() //获取文本框的宽度 public void setColumns(int columns) //设置文本框的宽度 public void setText(String t) //设置文本框中的文本为t
  • 24. 【例11-10】
  • 25. 文本域 文本域组件也是用来接收用户输入或程序输出的,不过与文本框不同的是,它允许进行多行输入或输出,因而它一般用于处理大量文本的情形。 AWT提供的文本域组件为TextArea类,它也是从TextComponent类继承而来。
  • 26. 【例11-11】
  • 27. 按钮 AWT提供的按钮类为Button,它是从Component类直接继承而来。
  • 28. 复选框 复选框组件也是图形界面上用于接受用户输入的一种快捷方式,一般是在界面上提供多个复选框选项,用户根据实际情况,可以多选也可以都不选。 AWT提供的复选框类为Checkbox。 事实上,该组件类类似于具有开关选项的按钮,用户单击选中,再单击则取消选中。
  • 29. 【例11-12】
  • 30. 单选框 在有些情况,程序界面可能给用户提供多个选项,但是只允许用户选中其中一个,这就是单选框的概念。 事实上,单选框是从上面复选框衍生而来的,它也采用Checkbox作为其组件类,不过为了实现单选效果,还需要另外一个组件类:CheckboxGroup,当我们把Checkbox类对象添加进某个CheckboxGroup对象后,它就成为了单选框。
  • 31. 【例11-13】
  • 32. 列表框 列表框组件看起来像文本域,可以有多行,每一行文本代表一个选项,文本域组件多用于用户编辑之用,而列表框多用于给用户几个选项进行选择,可以多选也可以单选。 AWT提供的列表框类为List,它直接继承于Component类,
  • 33. 【例11-14】
  • 34. 下拉框 下拉框组件提供一些选项供用户来选择,每次只能选一个,选中的选项会被单独显示出来,而改变选项则可以通过单击组件边上的箭头,再从下拉框中进行选择来完成。下拉框相比列表框而言,占据较小的界面区域。 AWT提供的下拉框类为Choice,它直接继承于Component类,
  • 35. 【例11-15】
  • 36. 滚动条 滚动条是图形用户界面中常见的组件之一,它既可以用作取值器,也可以用来滚动显示某些较长文本信息。 AWT提供的滚动条类为Scrollbar,它也是直接从Component组件继承而来, 【例11-16】
  • 37. 菜单 菜单将系统的各种功能选项以直观的方式展现出来,供用户选择,大大方便了用户与系统间的交互。 菜单相比其他组件类特殊,它是由几个菜单相关类共同构成的菜单系统。AWT提供的菜单系统类包括:MenuBar、MenuItem、Menu、CheckboxMenuItem以及PopupMenu,它们之间的继承关系如下图所示:
  • 38. MenuBar类对应菜单系统的整体,Menu类对应菜单系统中的一列菜单(实际上它只是一种特殊的菜单项),MenuItem和CheckboxMenuItem类则对应具体的菜单项,其中CheckboxMenuItem为带复选框的菜单项,而PopupMenu类对应弹出式菜单,它是菜单Menu类的子类。
  • 39. 注意由于各个类间存在继承关系,因而子类可以调用父类提供的部分常用方法。 菜单系统创建好后,最后必须调用Frame类的setMenuBar()方法将其加入到框架界面中。【例11-17】
  • 40. 事件处理 在早先的JDK1.0版本中提供的是称为层次事件模型的事件处理机制 。 在JDK1.1以后版本中便被基于事件监听模型的事件处理机制替代了,这种机制也称之为事件派遣机制或授权事件机制,它的处理效率相比层次事件模型大为提高 。
  • 41. 事件类及其对应的监听器AWT提供了很多的事件类及其对应的监听器(其实就是接口),它们都被放置到JDK的java.awt.event包中 。
  • 42. ActionEvent类表示一个广义的行为事件,可以是鼠标单击按钮或者菜单,也可以是列表框的某选项被双击或文本框中的回车行为。ActionEvent类对应的监听器为ActionListener接口,该接口只有一个抽象方法: public abstract void actionPerformed(ActionEvent actionevent); 注册该监听器需要调用组件的addActionListener()方法,撤销则调用组件的 removeActionListener()方法。
  • 43. KeyEvent类 当用户按下或释放键时产生该类事件,也称为键盘事件。对应的监听器为KeyListener接口,该接口定义有三个抽象方法: public abstract void keyTyped(KeyEvent keyevent); public abstract void keyPressed(KeyEvent keyevent); public abstract void keyReleased(KeyEvent keyevent); 注册键盘监听器可以通过调用组件的addKeyListener()方法来实现。
  • 44. MouseEvent类 当用户按下鼠标、释放鼠标或移动鼠标时会产生鼠标事件。该事件对应两种监听器:MouseListener和MouseMotionListener接口。鼠标按钮相关事件监听器由实现MouseListener接口的对象表示,而鼠标移动相关事件监听器则由实现MouseMotionListener接口的对象表示。MouseListener接口定义的抽象方法有5个: public abstract void mouseClicked(MouseEvent mouseevent); public abstract void mousePressed(MouseEvent mouseevent); public abstract void mouseReleased(MouseEvent mouseevent); public abstract void mouseEntered(MouseEvent mouseevent); public abstract void mouseExited(MouseEvent mouseevent);
  • 45. MouseEvent类MouseMotionListener接口定义的方法则有2个: public abstract void mouseDragged(MouseEvent mouseevent); public abstract void mouseMoved(MouseEvent mouseevent); 注册鼠标事件监听器可以调用相应的addMouseListener()和addMouseMotionListener()方法。
  • 46. TextEvent类 当一个文本框或文本域的内容发生改变时就会产生相应的TextEvent事件。该事件对应的监听器为TextListener接口,它仅定义了一个抽象方法: public abstract void textValueChanged(TextEvent textevent); 注册文本事件监听器必须调用组件的addTextListener()方法。
  • 47. FocusEvent类 当一个组件得到或失去焦点时,就会发生焦点事件。在当前活动窗口中,有且只有一个组件拥有焦点,当用户用Tab键操作或用鼠标单击其他组件时,一般焦点就会转移至其他组件上,此时就发生了FocusEvent事件。该事件对应的监听器为FocusListener接口,它有2个抽象方法: public abstract void focusGained(FocusEvent focusevent); public abstract void focusLost(FocusEvent focusevent); 注册焦点事件监听器需要调用组件的addFocusListener方法。
  • 48. WindowEvent类 当一个窗口被打开、关闭、激活、撤消激活、图标化或撤消图标化时就会产生窗口事件。WindowEvent类对应的监听器为WindowListener接口,该接口定义了7个抽象方法: public abstract void windowOpened(WindowEvent windowevent); public abstract void windowClosing(WindowEvent windowevent); public abstract void windowClosed(WindowEvent windowevent); public abstract void windowIconified(WindowEvent windowevent); public abstract void windowDeiconified(WindowEvent windowevent); public abstract void windowActivated(WindowEvent windowevent); public abstract void windowDeactivated(WindowEvent windowevent); 注册窗口事件监听器需要调用组件的addWindowListener()方法。
  • 49. 事件处理程序的编写步骤大致 (1)实现某一事件的监听器接口(定义事件处理类并实现监听器接口)。 (2)在事件处理类中根据实际需要实现相应的抽象方法。 (3)给组件注册相应事件监听器以指明该事件的事件源有哪些。
  • 50. 【例11-18】ActionEvent行为事件处理。 【例11-19】菜单事件处理。
  • 51. 【例11-20】鼠标事件处理。【例11-21】键盘事件处理。
  • 52. Adapter(适配器) Java规定:实现一个接口时必须对该接口的所有抽象方法进行具体的实现,为此,Java提供了一种叫做Adapter(适配器)的抽象类来简化事件处理程序的编写。 适配器类很简单,它其实就是一个实现了接口中所有抽象方法的“空”类,本身不提供实际功能 Java为具有多个抽象方法的监听接口提供相对应的适配器类,比如WindowListener、 WindowStateListener和WindowFocusListener一起对应一个WindowAdapter、KeyListener对应KeyAdapter、MouseListener对应MouseAdapter等,大家不妨到java.awt.event包中看看 。
  • 53. 举例 // 处理窗口关闭事件的常用方法(匿名适配器类) f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} } ); 上述代码很简洁,主要是因为我们采用了适配器类来实现简单的事件处理,由于这里只需要用到windowClosing()方法,因此只要给出它的覆盖实现即可,其他方法用户就可以不管了。
  • 54. Swing组件集简介 AWT组件的外观和显示直接依赖于本地系统,因此在移植程序时常会出现界面不一致的情形,为此,Sun公司在AWT的基础上又开发了一个经过仔细设计的、灵活而强大的新的GUI组件集Swing。 Swing组件集提供了比AWT更多、功能更强的组件,增加了新的布局管理方式(如BoxLayout),同时还设计出了更多的处理事件。
  • 55. 【例11-22】Swing编程示例一。图11-28 测试Swing的普通按钮组件
  • 56. 【例11-23】Swing编程示例二。图11-29 测试其他Swing按钮组件
  • 57. 【例11-24】Swing编程示例三。图11-30 主框架窗口图11-31 子框架窗口
  • 58. 小结 图形用户界面技术的概念和历史 用户界面设计原则 Java AWT组件集、事件处理机制 Sun在AWT之后推出的新组件集Swing
  • 59. 作业2 8 10