Presentation is loading. Please wait.

Presentation is loading. Please wait.

JAVA 编 程 技 术 主编 贾振华 2010年1月.

Similar presentations


Presentation on theme: "JAVA 编 程 技 术 主编 贾振华 2010年1月."— Presentation transcript:

1 JAVA 编 程 技 术 主编 贾振华 2010年1月

2 第11章 图形用户界面(GUI)设计

3 JAVA GUI 包 和 简 单 GUI 程 序 java.awt 包 抽象窗口工具集AWT(Abstract Window Toolkit),Java 最早的用于编写图形节目应用程序的开发包,Java进行GUI设计的基础。 javax.swing 包 Swing组件存放在javax.swing包中。几乎所有AWT组件对应有新功能更强的Swing组件。所以说Swing是为了解决 AWT 存在的问题而新开发的包,它以 AWT 为基础,另外还加入了一些全新的组件。Swing组件在名称上前面多了一个字母“J” 。

4 JAVA AWT 的 理 解 AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口。AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers。 也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的"一次编译,到处运行"的概念,AWT 不得不通过牺牲功能来实现其平台无关性,也就是说,AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT 是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。

5 JAVA Swing 的 理 解 Swing 是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充。例如说并不是所有的操作系统都提供了对树形控件的支持, Swing 利用了AWT 中所提供的基本作图方法对树形控件进行模拟。由于 Swing 控件是用100%的Java代码来实现的,因此在一个平台上设计的树形控件可以在其他平台上使用。由于在Swing 中没有使用本地方法来实现图形功能,我们通常把Swing控件称为轻量级控件。

6 JAVA AWT 和 Swing 的 区 别 AWT和Swing之间的基本区别:AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT 的Java程序,其运行速度比较慢。对于一个嵌入式应用来说,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的AWT 当然成了嵌入式Java的第一选择。而在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素,所以在标准版的Java中则提倡使用Swing, 也就是通过牺牲速度来实现应用程序的功能。

7 JAVA AWT 和 Swing 的 关 系

8 JAVA 浅 谈 MVC 模 式 MVC即:Model(模型)、View(视图)和Controller(控制)。
这个模式认为,程序不论简单或复杂,从结构上看,都可以分成三层。 1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。 2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。 3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。 这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。

9 JAVA 用Windows的计算器小程序为例,解释一下MVC模式。
在这个计算器程序中,外部的那些按钮和最上面的显示条,就是"视图层",那些需要运算的数字就是"数据层",执行加减乘除的那些内部运算步骤就是"控制层"。每一层执行不同的功能,整个程序的结构非常清楚。 我们扩大一点想象会发现,很多程序本质上都是这种模式:对外提供一组触发器( Windows的计算器中是按钮),执行一些内部操作,最后返回结果。因此,MVC模式的应用是非常广泛的。

10 java.awt包提供了基本的java程序的GUI设计工具。主要包括下述三个概念: · 组件 -- Component
· 容器 -- Container · 布局管理器 -- LayoutManager

11 JAVA 图 形 化 设 计 步 骤

12 对应于程序的初始显现窗口,窗口中放入其它菜单、工具栏、文本框、按钮等组件
JAVA 图 形 化 设 计 步 骤 第一步:创建顶层容器 对应于程序的初始显现窗口,窗口中放入其它菜单、工具栏、文本框、按钮等组件 顶层容器图形化界面显示的基础,其它所有的组件(控件)都是直接或间接显示在顶层容器中的。在java中顶层容器有三种,分别是JFrame(框架窗口,即通常的窗口)、JDialog(对话框)、JApplet(用于设计嵌入在网页中的java小程序)。 顶层容器是容纳其它组件的基础,即设计图形化程序必须要有顶层容器。

13 JAVA JFrame 框 架 窗 口 的 使 用

14 JAVA JFrame 框 架 窗 口 的 使 用

15 JAVA JFrame 框 架 窗 口 的 使 用

16 对应于程序中出现的菜单、工具栏(中间容器)、文本框、按钮、单选框、复选框等控件。
JAVA 图 形 化 设 计 步 骤 第二步:创建中间容器、组件 对应于程序中出现的菜单、工具栏(中间容器)、文本框、按钮、单选框、复选框等控件。 有很多Swing组件可以使用,见后面的Swing UI组件表。

17 Java中间容器是可以包含其它相应组件的容器,但是中间容器和组件一样,不能单独存在,必须依附于顶层容器。
图 形 化 设 计 步 骤 Java中间容器是可以包含其它相应组件的容器,但是中间容器和组件一样,不能单独存在,必须依附于顶层容器。 常见的中间容器有: JPanel:最灵活、最常用的中间容器。 JScrollPane:与 JPanel 类似,但还可在大的组件或可扩展组件周围提供滚动条。 JTabbedPane:包含多个组件,但一次只显示一个组件。用户可在组件之间方便地切换。 JToolBar:按行或列排列一组组件。

18 在java中创建组件后,还需要将组件放入相应的容器,才能在顶层容器,如窗口中显示出组件。 第四步:设置容器内组件的位置
图 形 化 设 计 步 骤 第三步:将组件加入容器 在java中创建组件后,还需要将组件放入相应的容器,才能在顶层容器,如窗口中显示出组件。 第四步:设置容器内组件的位置 组件添加到容器中,还必须设置好组件的显示位置,一般有两种方法来设置组建的显示位置,一是按照与容器的相对距离(以像素为单位),精确固定控件的位置;二是用布局管理器来管理组件在容器内的位置。

19 即用户执行选择菜单、单击按钮等操作时,就要执行相应的命令,进行相关的程序处理,这就需要设置组件的事件。
JAVA 图 形 化 设 计 步 骤 第五步:处理组件所产生的事件 即用户执行选择菜单、单击按钮等操作时,就要执行相应的命令,进行相关的程序处理,这就需要设置组件的事件。

20 JAVA AWT 类 的 层 次 结 构

21 JAVA 组 件(Component) 在AWT类层次结构的顶部是Component类。Component类是一个封装了一个可视组件的 所有属性的抽象类。在屏幕上显示的所有用于用户交互的用户界面元素都是Component类 的子类。这个类定义了一百多个用于事件管理的公共方法,这些事件包括鼠标或键盘的输 入,窗口位置或大小的改变以及重绘窗口。一个Component对象可以保存当前的前景色、背景色以及被选 择的文本的字体。

22 JAVA 容 器(Container) Container类是Component类的子类。这个类有一些附加方法,允许别的Component对象 嵌套在Container类的对象中。当然,其他的Container对象可以被存放在一个Container对象中(因为它们也是Component类的实例)。这就形成了一个多层包容机制。容器主要负责 布置它所包含的组件的位置。而它是通过使用一些设计管理器来完成这个功能的。

23 JAVA 面 板(Panel) Panel类是Container类的一个具体的子类。它没有添加任何新的方法;它只是简单的实现了Container类。一个Panel对象可以被看作是一个递归嵌套的具体的屏幕组件。Panel类是Applet类的父类。当屏幕输出直接传递给一个小应用程序时,它将在一个Panel对象的表面被画出。实际上,一个Panel对象是一个不包含标题栏、菜单栏以及边框的窗口。这就是为什么在浏览器中运行一个小应用程序时,你看不见标题栏、菜单栏以及边框的原因。而当你用小应用程序查看器来运行一个小应用程序时,小应用程序查看器提供了标题和边框。  

24 JAVA 面 板(Panel) 其它的组件可以通过调用Panel类的add()方法被加入到一个Panel对象中,这个方法是从Container类继承来的。一旦这些组件被加入,那么通常就可以通过调用在Component类中定义了的setLocation( ), setSize( )以及setBounds( )方法来改变组件的位置和大小。

25 JAVA 窗 口(Window) 窗口类产生一个顶级窗口(Window)。顶级窗口不包含在任何别的对象中,它直接出现在桌面上。通常,不会直接产生Window对象。相反,我们常常使用Window类的子类,这就是Frame类。

26 JAVA 框 架(Frame) Frame类封装了窗口通常所需要的一切组件,拥有标题栏、菜单栏、边框等等。我们经常利用Frame类在应用程序中创建顶级或子窗口,在小应用程序之中创建子窗口。如果你在一个小应用程序中创建了一个Frame对象,它将包含一个例如“Java Applet Window”的警告消息给用户,表示一个小应用程序窗口已经被创建。这个消息警告用户,所看见的窗口是由小应用程序启动的,而不是被运行在他们机器上的软件所启动。

27 JAVA 画 布(Canvas) 虽然画布不是小应用程序和frame窗口的层次结构的一部分,但是Canvas这种类型的窗口是很有用的。Canvas类封装了一个你可以用来绘制的空白窗口。

28 JAVA 创 建 窗 口 简单地说,通过创建一个frame类的实例来就能创建一个窗口,但是可能很少会这样做,因为对于这样的窗口没有什么可以做的。例如,不能接受和处理在这个窗口中发生的事件或者不能简单的输出信息给它。大多数情况我们是创建一个frame类的子类。 在小应用程序中创建一个新的基于frame的窗口是很容易的。首先,创建一个frame类的子类。接下来,重载任何一个标准窗口方法,比如init( )方法,start( )方法,stop( )方法和paint( )方法。最后,实现windowListener监听器接口的windowClosing( )方法,在这个方法中,当窗口被关闭时,调用setVisible(false)方法将窗口从屏幕中除去。

29 JAVA Swing 体 系 结 构 Swing体系结构最初Smalltalk系统的UI工具使用所谓的模型-视图-控制(MVC)模式,MVC引入这样一个概念:数据源应该同屏幕展现分开。这是一个优秀的体系设计结构,能促进代码重用和程序框架。Swing使用的是一个变体的MVC架构。 典型的Swing GUI组件包括至少三个对象:一个Component,一个Model和一个UI Delegate,在这个框架中,Model负责存储数据,UI Delegate负责从Model获取数据并渲染到屏幕上去,Component通常协调Model和Delegate之间的操作,并同时负责将 Swing嵌入到AWT窗口系统中。 注意,UI Delegate对象可以在运行的时候动态替换,这就使Swing具备了可插拔的外观(Pluggable Look-And-Feel, PLAF)。

30 JAVA Swing 开 发 GUI 的 基 本 约 定 Swing提供4个顶层容器JFrame, JDialog, JApplet,JWindow,如果是桌面应用,则GUI必须要有一个JFrame,如果是浏览器应用,则GUI必须要有一个JApplet。其他Swing组件,或自定义开发的Swing组件都扩展自JComponent,并且其实例要存在于顶层容器的层次树中。

31 JAVA JComponent(组件层次图)

32 (1)把Swing组件放入一个顶层Swing容器的内容面板上 (2)避免使用非Swing的重量级组件。
JAVA 使 用 Swing 的 基 本 规 则 与AWT组件不同,Swing组件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(content pane)上。内容面板是顶层容器包含的一个普通容器,它是一个轻量级组件。基本规则如下: (1)把Swing组件放入一个顶层Swing容器的内容面板上 (2)避免使用非Swing的重量级组件。

33 Container getContentPane(); //获得内容面板
JAVA 根 面 板 根面板由一个玻璃面板(glassPane)、一个内容面板(contentPane)和一个可选择的菜单条(JMenuBar)组成,而内容面板和可选择的菜单条放在同一分层。玻璃面板是完全透明的,缺省值为不可见,为接收鼠标事件和在所有组件上绘图提供方便。 根面板提供的方法: Container getContentPane(); //获得内容面板 setContentPane(Container); //设置内容面 JMenuBar getMenuBar( ); //活动菜单条 setMenuBar(JMenuBar); //设置菜单条 JLayeredPane getLayeredPane(); //获得分层面板 setLayeredPane(JLayeredPane); //设置分层面板 Component getGlassPane(); //获得玻璃面板 setGlassPane(Component); //设置玻璃面板

34 JAVA 面 板 和 分 层 面 板 面板(JPanel) 面板(JPanel)是一个轻量容器组件,用法与Panel相同,用于容纳界面元素,以便在布局管理器的设置下可容纳更多的组件,实现容器的嵌套。Jpanel, JscrollPane, JsplitPane, JinteralFrame都属于常用的中间容器,是轻量组件。Jpanel的缺省布局管理器是FlowLayout。 分层面板(JLayeredPane) Swing提供两种分层面板:JlayeredPane和JDesktopPane。 JDesktopPane是JLayeredPane的子类,专门为容纳内部框架(JInternalFrame)而设置。向一个分层面板种添加组件,需要说明将其加入哪一层,指明组件在该层中的位置:add(Component c, Integer Layer, int position)。

35 Jpanel contentPane=new Jpanel( ); ……//把其它组件添加到Jpanel中;
JAVA Jframe 添加组件的两种方式 用getContentPane( )方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(childComponent) 建立一个Jpanel或 JDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该容器置为JFrame的内容面板: Jpanel contentPane=new Jpanel( ); ……//把其它组件添加到Jpanel中; frame.setContentPane(contentPane); //把contentPane对象设置成为frame的内容面板

36 Java 最新的事件处理方法是基于授权事件模型
事 件 处 理 模 型 Java 最新的事件处理方法是基于授权事件模型 当事件来源对象因用户的操作(鼠标或键盘),系统会自动触发此事件类对象E,并通知所授权的事件监听者A(若来源对象已向A注册),事件监听者A中有处理各种事件的方法(事件处理者1~n)便会处理此事件E的各种状况 。

37 JAVA 事 件 层 次 结 构 事件类 说明 事件源 ActionEvent 通常按下按钮,双击列表项或选中一个菜单项时,就会生成此事件。
Button、List、MenuItem、TextField AdjustmentEvent 操纵滚动条时会生成此事件。 Scrollbar ComponentEvent 当一个组件移动、隐藏、调整大小或成为可见时会生成此事件。 Component ItemEvent 单击复选框或列表项时,或者当一个选择框或一个可选菜单的项被选择或取消时生成此事件。 Checkbox、CheckboxMenuItem、Choice、List FocusEvent 组件获得或失去键盘焦点时会生成此事件。

38 JAVA 事 件 层 次 结 构 事件类 说明 事件源 KeyEvent 接收到键盘输入时会生成此事件。 Component
MouseEvent 拖动、移动、单击、按下或释放鼠标或在鼠标进入或退出一个组件时,会生成此事件。 ContainerEvent 将组件添加至容器或从中删除时会生成此事件。 Container TextEvent 在文本区或文本域的文本改变时会生成此事件 。 TextField、TextArea WindowEvent 当一个窗口激活、关闭、失效、恢复、最小化、打开或退出时会生成此事件。 Window

39 addxxxListener(事件监听器对象); 确定了事件监听器的类型后,必须在程序中定义类来实现这些接口,重写接口中的所有方法。
JAVA 事 件 处 理 方 法 实现事件监听器接口法: 首先给组件注册监听器,使用下列方法: addxxxListener(事件监听器对象); 确定了事件监听器的类型后,必须在程序中定义类来实现这些接口,重写接口中的所有方法。 addKeyListener(new CharType()); public class CharType implements KeyListener{ public void keyPressed(KeyEvent e){……} //大括号中为处理事件的代码 public void keyReleased(KeyEvent e){} //未用到此方法,所以方法体为空 public void keyTyped(KeyEvent e){} }

40 使用实现事件监听器接口的方法处理事件时,必须重写监听器接口中的所有方法,尽管有些方法不会用到。
JAVA 事 件 适 配 器 使用实现事件监听器接口的方法处理事件时,必须重写监听器接口中的所有方法,尽管有些方法不会用到。 继承事件适配器类,只需要重写所需要的方法即可。 addKeyListener(new CharType()); 为事件源注册事件监听器的方法同上。 public class CharType extends KeyAdapter{ public void keyPressed(KeyEvent e){……}//大括号中为处理事件的代码 }

41 JAVA 考 试 样 题(1)

42 JAVA 考 试 样 题(2)


Download ppt "JAVA 编 程 技 术 主编 贾振华 2010年1月."

Similar presentations


Ads by Google