第6章Java图形用户界面设计.docx
- 文档编号:6871095
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:26
- 大小:352.41KB
第6章Java图形用户界面设计.docx
《第6章Java图形用户界面设计.docx》由会员分享,可在线阅读,更多相关《第6章Java图形用户界面设计.docx(26页珍藏版)》请在冰豆网上搜索。
第6章Java图形用户界面设计
第6章Java图形用户界面设计
6.1图形用户界面(GUI)概述
用户界面是用户和计算机系统交互的接口。
用户界面功能是否完善和便捷直接影响到用户对软件的使用。
图形用户界面(GraphicsUserInterface)简称GUI,使用图形的方式借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便的发出系统命令,启动操作。
Java的基础类(JavaFoundationClasses,JFC)是开发GUI的API集,它包括以下几个部分:
AWT(抽象窗口工具包):
Java开发图形用户界面最初的工具包,是建立JFC的主要基础;
Swing组件:
建立在AWT之上,新的、功能更强大的图形组件包;
Java语言为了方便图形用户界面的开发,设计了专门的类库来生成各种标准图形界面和处理图形界面的各种事件,这个类库就是java.awt包。
AWT是AbstractWindowToolkit(抽象窗口工具集)的缩写。
AWT类库中的各种操作被定义在一个并不存在的抽象窗口中进行,以实现跨平台性。
AWT抽取了不同软硬件平台中所实现的窗口的公共特性。
所设计的界面独立于具体的界面实现。
AWT提供与机器无关的基本GUI标准组件。
AWT包含的构件太多,主要讨论以下几个最重要的类:
基本的窗口类:
Frame,Dialog。
基本的GUI构件类:
Button,Label,TextField,TextArea。
基本的事件接口:
ActionListener,WindowListener,MouseListener,KeyListener。
基本的版面控制:
FlowLayout,BorderLayout,GridLayout,Panel。
基本的绘图支持:
Graphics,Canvas。
java.awt包中的类及相互关系可以用下图来描述:
6.2基本的图形用户界面类
Component类
java.awt包中最核心的类就是Component类,大部分控制组件都是由该类派生出来的,用于完成与用户的交互。
Component定义了组件所具有的一般功能:
基本的绘画支持(方法paint,repaint,update等)、
字体和颜色等外形控制(方法setFont,SetForeground等)、
大小和位置控制(方法setSize,setLocation等)、
图象处理(接口ImageObserver)
组件状态控制(方法SetEnable,isEnable,isVisible,isValid等)
常用的组件包括:
Button,Checkbox,CheckboxGroup,Choice,Label,List,Canvas,TextComponent,Scrollbar等。
Container类
Container类是由Component类派生出来的一种特殊类,用来表示各种GUI组件的容器。
通常,一个图形用户界面程序首先对应于一个容器,这个容器再进一步包括其它的界面成分和元素,以构成一个复杂的图形界面系统。
Container类主要功能包括:
组件的管理:
如方法add()可以向其中添加一个组件,remove()删除其中的一个组件,…
布局管理:
每个Container类都和一个布局管理器相联,以确定其中组件的布局。
Container类可以通过setLayout()方法设置某种布局方式。
常见的Container类有:
Window,Frame,Panel,Applet等。
AWT对Container类的定义为:
publicabstractclassContainerextendsComponent{
protectedContainer()
publicvoidadd(Componentcomp)
publicvoidadd(Componentcomp,Objectconstraints)
publicInsetsgetInsets()
publicvoidsetLayout(LayoutManagermgr)
publicvoidvalidate()
publicDimensiongetPreferredSize()
publicvoidpaint(Graphicsg)
}
Window类
Window类表示一个没有边界和菜单的最高层的窗口,可以包含AWT的其他构件。
初始化时,窗口是不可见的。
AWT将窗口定义为:
publicclassWindowextendsContainer{
publicWindow(Frameparent)
publicvoidpack()
publicvoidsetVisible()
publicvoidtoFront()
publicvoidtoBack()
publicvoidaddWindowListener(WindowListenerl)
publicvoidremoveWindowListener(WindowListenerl)
}
Frame类
一个Frame是包括标题、菜单、文本区和按钮的图形窗口,其外观依赖于所使用的的操作系统。
Frame包含在一个方框内,其大小可以伸缩。
AWT对Frame类的定义的大致框架为:
publicclassFrameextendsWindowimplementsMenuContainer{
publicFrame()
publicFrame(Stringtitle)//重载的构造方法
publicStringgetTitle()
publicvoidsetTitle(Stringtitle)
publicMenuBargetMenuBar()
publicvoidsetMenuBar(MenuBarmb)//设置菜单条
publicvoiddispose()
}
【例6.1】下面用一个简单程序来建立一个Frame对象,并使之可见。
importjava.awt.Frame;
publicclassMyFrameTest{
publicstaticvoidmain(Stringargs[]){
FramemyFrame=newFrame("MyFirstFrame");
myFrame.setVisible();//使一个Frame可见
}
}
当这个程序执行时,会出现一个带标题的小窗口,这个窗口可以伸缩并且包含有标准的关闭按钮。
但目前这个窗口还没有响应关闭按钮的能力,因此必须按CTRL+C键来关闭窗口.
6.3简单的事件响应程序
什么是事件(Event)?
事件(Event):
发生在用户界面上的用户交互行为而产生的一种效果,如鼠标的各种点击动作、键盘的操作以及发生在组件上的各种动作。
事件一般也分为三种类型:
键盘事件、鼠标事件以及组件的动作事件(对鼠标或键盘事件在一定程度上进行了封装)。
事件源(EventSource):
产生事件的对象。
事件处理(Eventhandler):
接收事件对象消息并对其进行处理的方法。
6.3.1一个简单的构件与事件的响应
大多数的程序通过GUI构件与用户进行交互。
最简单的GUI构件是按钮。
当用户单击一个按钮时,它就产生一个事件,该事件被一个类的特殊方法所接受,并采取相应的处理方法。
Button类的定义为:
publicclassButtonextendsComponent{
publicButton()
publicButton(Stringlabel)
publicStringgetLabel()
publicvoidsetLabel(Stringlabel)
publicvoidaddActionListener(ActionListenerl)
publicvoidremoveActionListener(ActionListenerl)
}
【例6.2】构造一个类,该类为一个带有标题的Frame,Frame中包含一个Quit按钮,单击该按钮就退出程序。
所以,要构造的类扩展Frame类,并包含一个Button域。
像大多数类一样,它有一个构造方法和一个可执行的main()方法,其程序框架如图所示:
以上程序执行时,当单击按钮时,没有什么反应。
这是由于仅在按钮上标有“Quit”,并没有给它添加足够的机制使它产生相应的行为,要使它作出正确的响应需要如下3个步骤:
通知JVM该类要监督和处理一个动作事件。
激活按钮,使得单击按钮时产生一个事件。
实现一个方法来说明如何处理这个按钮事件。
Java提供了ActionListener接口将GUI构件产生的事件(如按钮产生的事件)与一个特定的事件响应方法联系起来,使之能够决定怎样响应某些事件。
ActionListener接口
ActionListener是java.awt.event包中的一个接口,它定义了一个特定的事件处理方法。
AWT对这个接口的定义是:
publicinterfaceActionListenerextendsEventListener{
//说明抽象方法
publicabstractvoidactionPerformed(ActionEvente)
}
【例6.3】本例介绍怎样利用ActionListener接口来监听一个按钮,然后说明这个按钮应该引起哪些事件。
分析这个例子,一个基本的按钮事件驱动程序可以按照下面的框架来编写:
从java.awt和java.awt.event中装载所有的类
定义一个类扩展Frame并且实现ActionListener接口
定义GUI构件,如button等,作为该类的域
使用构造方法来定义构件的布局,并用buttonName.addActionListenerName(this)来激活按钮
定义一个方法publicvoidactionPerformed(ActionEventae)来说明单击按钮后要采取的行动。
6.3.2简单的GUI输入输出
TextField类
TextField是对一行文本进行编辑的一个构件。
它用来接受用户的输入或显示可编辑的文本输出。
AWT对它的定义为:
publicclassTextFieldextendsTextComponent{
publicTextField()
publicTextField(Stringtext)
publicTextField(intcolumns)
publicTextField(Stringtext,intcolumns)
publicvoidaddActionListener(ActionListenerl)
publicvoidremoveActionListener(ActionListenerl)
}
TextComponent类
TextComponent是一个允许创建、检索和修改文本的类。
AWT对这个类的定义为:
publicclassTextComponentextendsComponent{
publicvoidsetText(Stringt)
publicStringgetText()
publicbooleanisEditable()
publicvoidsetEditable(booleanb)
publicStringgetSelectedText()
publicvoidaddTextListener(TextListenerl)
publicvoidremoveTextListener(TextListenerl)
}
【例6.4】编写一个程序包含有两个按钮和一个文本输出区,其中一个按钮引起程序退出,另一个按钮在输出区显示文本,而且每次当第二个按钮被单击时交替地显示两种文本。
我们可以用IS、HAS和DOES来定义这个类的轮廓:
IS:
Frame和ActionListener。
HAS:
两个按钮和一个文本输出区,并需要一个boolean变量来决定显示哪个字符串。
DOES:
用main()方法使这个程序可执行,用构造方法进行初始化,并用actionPerformed()处理按钮事件。
如何在构造方法中放置两个按钮和一个文本域。
我们先用setLayout(newFlowLayout())将所有的构件排列在一行。
(2)actionPerformed()方法需要对单击quit和click按钮做出响应,所以需要找出内部接受到的事件源。
使用ActionEvent类的getSource()方法,该方法返回一个事件源。
例6.4
6.4事件处理
6.4.1基本事件
在所有基于GUI的程序中,其核心是事件。
事件是可视化构件或用户接口构件产生的信息,Java类通过使用特殊的方法能够对它作出反应。
所有的事件保存在系统级的事件队列中,可由事件响应方法对它们进行检索并作出响应。
事件分为如下两种类型:
低级事件:
表示低级输入或在屏幕上的可视构件窗口系统事件,这些事件描述为:
ComponentEvent(组件事件:
组件尺寸的变化,移动)
ContainerEvent(容器事件:
组件增加,移动)
WindowEvent(窗口事件:
关闭窗口,窗口闭合,图标化)
FocusEvent(焦点事件:
焦点的获得和丢失)
KeyEvent(键盘事件:
键按下、释放)
MouseEvent(鼠标事件:
鼠标单击,移动)
高级事件(语义事件):
包括接口构件产生的用户定义的信息,这些事件描述为:
ActionEvent(动作事件:
按钮按下,TextField中按Enter键)
AdjustmentEvent(调节事件:
在滚动条上移动滑块以调节数值)
ItemEvent(项目事件:
选择项目,不选择项目)
TextEvent(文本事件,文本对象改变)
6.4.2Java中的事件处理
在JDK1.1之后,事件处理模型将事件源(产生事件的组件)和对事件的具体处理(利用一种称为监听器[listener]的实体来对事件进行具体的处理)分开。
组件(事件源)都不处理自己的事件,而是将事件处理委托给一个或多个处理实体(监听器),这种事件处理模型称为事件的授权处理模型。
不同的类型事件,可以交由不同类型的监听器去处理。
Java的事件类
每个事件源可以产生多个特定类型的事件,所有事件都放在包java.awt.event中,这些事件都从java.util.EventObject而来,它是所有事件类的超类,它有两个主要的方法:
getSource()获取一个特定的事件源
toString()返回事件对象名的字符串
对于发生在组件上的事件,则由java.awt.event.AWTEvent派生。
java.awt.event中常用的事件类有:
ActionEvent、AdjustmentEvent、ComponentEvent、ContainerEvent、FocusEvent、InputEvent、ItemEvent、KeyEvent、MouseEvent、MoseWheelEvent、TextEvent、WindowEvent最常用的事件类型及其方法见表6.2
事件监听器(EventListener)
事件源和监听器是委托事件模型的两部分。
Java提供了抽象的响应特定事件的“事件监听器”,它们在java.awt.event包中被定义为接口,每个构件可以通过调用addXXXListener(XXXListenerl)方法使某个事件监听器来监听某个事件源。
当一个事件发生时,事件源调用监听器所定义的处理方法,并提供该事件对象作为它的参数。
常用的事件监听器接口有:
ActionListener、AdjustmentListener、ComponentListener、ContainerListener、FocusListener、ItemListener、KeyListener、MoseListener、MouseMotionListener、MousWheelListener、TextListener、WindowListener、WindowFocusListener。
事件监听器及其抽象方法见表6.3
ActionEvent事件
触发时机:
单击按扭,双击列表框中选项,选择菜单项,文本框中按回车键
事件监听接口:
ActionListener
接口方法:
actionPerformed(ActionEvente)
组件注册该事件方法:
addActionListener(监听者)
AdjustmentEvent事件
触发时机:
操作滚动条改变滑块位置AdjustmentEvent
事件监听接口:
AdjustmentListener
接口方法:
adjustmentValueChanged(AdjustmentEvent e)
组件注册该事件方法:
addAdjustmentListener(监听者)
表示事件类型的常量:
BLOCK_DECREMENT点击滚动条减小它的值
BLOCK_INCREMENT点击滚动条增加它的值
TRACK拖动滑块
UNIT_DECRMENT点击顶端按钮减小它的值
UNIT_INCREMENT点击顶端按钮增加它的值
ComponentEvent事件
触发时机:
当组件移动、改变大小、改变可见性时引发
事件监听接口:
ComponentListener
接口方法:
componentHidden(ComponentEvente)组件隐藏
componentMoved(ComponentEvent e)组件移动
componentResized(ComponentEvent e)组件改变大小
componentShown(ComponentEvent e)组件变为可见
接口适配器ComponentAdapter
组件注册该事件方法:
addComponentListener
ContainerEvent事件
触发时机:
当容器增加或删除组件时引发
事件监听接口:
ContainerListener
接口方法:
componentAdded(ContainerEvent e)容器内加入组件
componentRemoved(ContainerEvent e)从容器中移走组件
接口适配器ContainerAdapter
容器注册该事件方法:
addContainerListener
(5)FocusEvent事件FocusEventDemo
触发时机:
组件获得焦点、组件失去焦点
事件监听接口FocusListener
接口方法:
focusGained(FocusEvent e)组件获得焦点时调用
focusLost(FocusEvent e)组件失去焦点时调用
接口适配器:
FocusAdapter
组件注册该事件方法:
addFocusListener(监听者)
(6)ItemEvent事件ItemEventDemo
触发时机:
改变列表框中的选中项、改变复选框选中状态、改变下拉列表框的选中项
事件监听接口:
ItemListener
接口方法:
itemStateChanged(ItemEvent e)
组件注册该事件方法:
addItemListener(监听者)
(7)TextEvent事件TextEventDemo
触发时机:
输入字符到文本框或文本区域
事件监听接口:
TextListener
接口方法:
textValueChanged(TextEvent e)
组件注册该事件方法:
addTextListener(监听者)
(8)KeyEvent事件
触发时机:
击完键(KEY-TYPED),按下键(KEY-PRESSED),释放键(KEY-RELEASE)
事件监听接口:
KeyListener
接口方法:
keyPressed(KeyEvent e)键被按下时调用
keyReleased(KeyEvent e)键被释放时调用
keyTyped(KeyEvent e)键被击完生成字符时调用
KeyEvent的方法:
chargetKeyChar():
返回键盘输入的字符。
intgetKeyCode():
返回键盘码
事件监听适配器(抽象类)KeyAdapter
组件注册该事件方法:
addKeyListener(监听者)
(9)WindowEvent事件
触发时机:
有关窗口操作引发的事件
事件监听接口WindowListener
接口方法:
windowActivated(WindowEvent e)激活窗口
windowClosed(WindowEvent e)调用dispose方法关闭窗口后
windowClosing(WindowEvent e)用窗口关闭框关闭窗口
windowDeactivated(WindowEvent e)本窗口成为非活动窗口
windowDeiconified(WindowEvent e)从最小化恢复为普通窗口
windowIconified(WindowEvent e)窗口变为最小化图标
windowOpened(WindowEvent e)窗口第一次打开成为可见时
注册事件方法:
addWindowListener
(10)MouseEvent事件
触发时机:
(鼠标作用在一个组件上)
1)鼠标事件:
鼠标键按下,鼠标键抬起,单击鼠标,鼠标光标进入一个组件,鼠标光标离开一个组件。
2)鼠标移动事件:
鼠标移动,鼠标拖动
鼠标事件监听接口1:
MouseListener接受鼠标事件
该接口方法:
mouseClicked(MouseEvent e)单击鼠标
mouseEntered(MouseEvent e)鼠标光标进入一个组件
mouseExited(MouseEvent e)鼠标光标离开一个组件
mousePressed(MouseEvent e)鼠标按下
mouseReleased(MouseEvent e)鼠标释放
鼠标事件监听适配器(抽象类)MouseAdapter
鼠标事件监听接口2:
MouseMotionListener接受鼠标移动事件
该接口方法:
mouseMoved(MouseEvent e)鼠标光标在组件上移动
mouseDragged(MouseEvent e)用鼠标拖动一个组件
鼠标移动事件监听适配器MouseMotionAdapter
组件注册鼠标事件方法:
addMouseListener(监听者)
组件注册鼠标移动事件方法:
addMouseMotionListener(监听者)
MouseEvent的方法
intgetClickCount()=1单击=2双击
PointgetPoint()取鼠标光标坐标
intgetX()intgetY()取鼠标光标位置
【例6.5】编制一个包含有Frame的程序,它通过打印简单的字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 图形 用户界面 设计