第五讲图形用户界面第五章图形用户界面设计5.1Java的GUI概述1、图形用户界面GUI(GraphicsUserInterface),就是应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮、工具栏和其他各种界面元素。2、在Java里有两个包为GUI设计提供了丰富的功能:awt(abstractwindowstoolkit)包和Swing包。3、awt是java的早期版本,组件种类有限,只提供基本的GUI设计工具。4、Swing包是SUN公司对早期版本的改进版本,它不仅包括AWT中所有部件,并且提供了更加丰富的部件和功能,它足以完全实现GUI设计所需的一切功能。5、Swing会用到AWT中许多知识,掌握了AWT,也就基本掌握了Swing。一些基本概念AWT英文全称:AbstractWindowingToolkit中文名:抽象窗口工具包AWT是Java图形用户界面设计的基础包:java.awtAWT组件举例Frame:基本的窗体类Button:按钮类TextField:文本框类Label:标签类CheckBox:复选框类List:列表类初识awt实例importjava.awt.*;//引用awt包中的组件类publicclassTestFrame{publicstaticvoidmain(String[]args){//产生一个具有标题栏的框架窗口Framefrm=newFrame(“我的框架窗口”);frm.setSize(300,300);//设置窗口的大小frm.setVisible();//显示窗口}}创建窗体的步骤:1.创建一个窗体对象(Framefrm=newFrame())2.设置窗体的大小(frm.setSize(400,400))3.显示窗体(frm.setVisible())例:AWT开发图形界面在窗体中加入一个按钮importjava.awt.*;//导入awt工具包publicclassAWTFrame//类名是AWTFrame{publicstaticvoidmain(String[]args)//main方法{Framefrm=newFrame();//声明并实例化了一个Frame对象frm.setSize(400,300);//把窗体对象的宽度设为400,高度设为300frm.setLayout(null);//设置窗体布局为空,必须要有这个语句Buttonbtn=newButton(一个按钮);//创建一个Button对象,按钮文字是“一个按钮”btn.setLocation(100,100);//设置按钮的位置,左上角坐标是(100,100)btn.setSize(80,20);//设置按钮的大小,宽为80,高为20frm.add(btn);//把这个按钮加到frm窗体中//frm.remove(btn);frm.setVisible(true);//显示窗体}}5.1.1GUI组件分类在AWT的概念中,窗口系统中所显示的各种对象都统称为“GUI组件”(Component)。组件有基本组件和容器组件之分。1、顾名思义,基本组件是不可再分割的组件,基本组件各自都有它们特定的功能。基本组件是构成图形用户界面的基本元素。2、容器组件是用来包含其他组件的,故称之为容器(container)。用户可以把各种组件放入到容器中,也可以把容器放到另一个容器中,从而形成具有层次的组件结构。3、AWT提供了的容器类有:Frame类、Dia1og类和Panel类。除了AWT提供的容器外,Applet类也是一个容器,它是Panel类的一个子类。AWT标准组件图示ObiectEventGraphicsComponentCheckboxGroupTextComponentContainerButtonTextFieldCheckboxWindowpanelAppletLabelListChoiceTextAreaDialogFrameFileDialogScrollbarCanvasColorFontFlowLayoutAWT中主要类及其关系ComponentButton,Canvas,Checkbox,Choice,Label,List,ScrollbarTextComponentTextAreaTextFieldContainerPanelWindowScrollPaneDialogFrameMenuComponentMenuBarMenuItemAWT组件java.awt包基本组件中文名称功能Button按钮完成一个命令Checkbox复选框可以同时进行多个选择CheckboxGroup单选框只能在一组中选择一项Choice下拉式列表创建一个弹出式的选择菜单List列表创建一个选择列表Menu菜单创建菜单系统TextField文本框输入单行文字Label标签在标签内绘制字符Canvas画布进行绘画TextArea多行文本框输入多行文字ScrollBar滚动条在指定的范围内选择一个值5.1.2基本组件Button、Label、TextField常用方法:setSize():设置组件大小setLocation():设置组件位置setText():设置文字setBackground():设置背景颜色…….5.1.3容器组件由标准组件图得知,AWT包中的类继承层次:一部分直接从Object类继承,包括组件类:Component大部分基本组件从Component继承,也包括容器类:Container一部分从Container继承,这些类全部是容器类组件通过继承的概念得知,由父类派生出的子类都会继承父类的成员(包括变量和方法)所有容器类都具有的方法和变量可从Container类中了解。(JavaAPI)add()方法:frm.add(btn)remove()方法:frm.remove(btn)setLayout()方法:frm.setLayout(null)子类说明AppletPanel.Applet的扩展,使所有Applet的超类Dialog对话框(可模式化或非模式化Window的扩展)FieldDialog用于选择文件的对话框FrameWindow的扩展,应用程序的容器,可以有菜单和标题栏PanelContainer的扩展,简单的容器WindowContainer的扩展,没有菜单或边界,是Frame和Dialog的超类5.1.3容器组件Frame类常用方法:setSize():设置窗口大小setLocation():设置窗口位置setResizable():设置窗口大小是否可调整setTitle():设置窗口标题setBackground:设置背景颜色…….5.2事件与事件处理问题的提出:到目前为止,我们的图形用户界面程序基本上没有交互能力,或者说不能对鼠标和键盘的操作做出反应,如何能使界面听从指挥,就是事件处理要做的事情。Java事件模型—基本概念事件源:发生事件的组件。如:按钮、输入文本框、菜单项、窗口。事件:用户对组件的一个操作,称之为一个事件。如:单击按钮、输入文本、选择菜单、点击窗口关闭按钮事件监听器:由实现了事件监听器接口的类创建的对象,负责接收、解释并处理事件的对象。事件监听器接口:规定了处理某种事件时必须实现哪些方法。在JDK1.1之后,事件处理模型将事件源(产生事件的组件)和对事件的具体处理(利用一种称为监听器[listener]的实体来对事件进行具体的处理)分开。组件(事件源)都不处理自己的事件,而是将事件处理委托给一个或多个处理实体(监听器),这种事件处理模型称为事件的授权处理模型。不同的类型事件,可以交由不同类型的监听器去处理。事件机制组件(事件源)事件监听器事件对象(1)事件监听器注册外部作用(2)生成事件对象(3)把事件对象传入事件处理器(3)事件源(M)事件监听器(N)事件监听器的注册():M.addXXXListener(N)事件及事件类:AWT对各种不同的用户操作进行分类,每一类对应于java.awt.event包中的一个事件类。用户对组件操作时,对于不同的组件或对组件的不同操作会产生不同的事件对象。委托事件处理模型Frame充当监听者4.提交actionPerformed方法5.调用6.完成某件事情按钮1.监听3.产生事件效果Frame用户2.点击JVM事件处理的包java.awt.event包,它提供AWT事件处理所需的类和接口。事件类事件类型事件名称事件说明引发情况低级事件类ComponentEvent组件事件组件移动,组件大小变化ContainerEvent容器事件容器内组件的添加、删除FocusEvent焦点事件获得焦点、失去焦点InputEvent输入事件键盘输入、鼠标操作KeyEvent键盘事件某键按下、某键松开MouseEvent鼠标事件鼠标移动、鼠标按下WindowEvent窗口事件窗口关闭、窗口图标化等语义事件类ActionEvent动作命令事件选中菜单、按下按钮等AdjustmentEvent数值调整事件滚动条位置改变ItemEvent选项事件列表框、选择框等选项选中TextEvent文本事件文本框的输入、修改等事件处理的具体过程事件处理过程:针对某事件(XXXEvent)创建事件监听器类,实现相应的事件监听器接口(XXXListener)可以不单独定义事件监听器类,而在当前类中实现该接口。当前对象就可以做为事件监听器。事件源注册监听器对象(addXXXListener())对于文本框:在文本框获得焦点后按回车键时会发生ActionEvent事件,处理此事件的过程:主类中实现接口ActionListener,实现其中的方法actionPerformed()文本框对象注册监听器:addActionListener(this)例如:Text1=newTestField(“0.0”,30)Text1.addActionListener(this)说明一个事件源可能会产生多种事件,每一种事件处理都需要注册监听器,因此一个事件源可能会注册多个监听器。f.addMouseMotionListener(this);f.addMouseListener(this);事件监听器可以实现多个事件监听器接口,此时可监听处理多类事件。……implementsMouseMotionListener,MouseListener,WindowListenerActionEvent中的方法publicObjectgetSource()获取事件源对象event.getActionCommand(),获取组件的字符串名称。例如:But1=newButton(按钮1);e.getActionCommand();e.getSource();importjava.awt.*;importjava.awt.event.*;classBtnListenerimplementsActionListener{publicvoidactionPerformed(ActionEvente){System.out.println(“点击按钮”);}}//定义监听器类publicclassAWTFrameE{publicstaticvoidmain(String[]args){Framefrm=newFrame();frm.setSize(400,300);frm.setLayout(null);Buttonbtn=newButton(一个按钮);btn.setLocation(100,100);btn.setSize(80,20);BtnListenerbl=newBtnListener();生成监听器btn.addActionListener(bl);添加监听器frm.add(btn);//把这个按钮加到frm窗体中frm.setVisible(true