JAVA图形用户界面的设计与实现课件_第1页
JAVA图形用户界面的设计与实现课件_第2页
JAVA图形用户界面的设计与实现课件_第3页
JAVA图形用户界面的设计与实现课件_第4页
JAVA图形用户界面的设计与实现课件_第5页
已阅读5页,还剩69页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章图形用户界面的设计与实现17.1图形用户界面(GUI)概述界面设计的主要任务:(1)创建组成界面的各成分和元素,指定它们的属性和位置关系;(2)定义界面事件和各元素对不同事件的响应,实现界面与用户的交互功能;生成界面的类库:java.awt(abstractwindowtoolkit)抽象:操作定义在一个虚拟的窗口中进行,实现跨平台;2界面的元素和成分容器控制组件用户自定义成分3容器(1)容器(container):组织其他界面成分和元素的单元,用来存放别的组件。有三种类型的容器:Window、Panel和ScrollPane。

ContainerPanelWindowScrollPaneAppletDialogFrameFileDialog4容器(2):Frame容器Window是能独立存在的容器,Frame是它的子类。Frame是有边框容器,通常用作最外层容器,不能被其他容器包含。Frame方法:Frame(Stringtitle);add():在Frame中加入其他组件。pack()方法会自动确定Frame的大小,确保Frame容器中的组件都会有与布局相适应的合理大小。setVisible(true):使Frame成为可见。Frame被创建后,它是不可见的。例子:见2007\ch7\src\SimpleFrame.java5容器(3):Panel容器特点:1)没有边框,不能被移动、缩放或关闭。2)不能作为最外层图形界面的容器,不能单独存在只能用做容器组件加入其他容器。3)通常用于层次化界面组件管理。P260:例7-20TestPanel.java例子:ch7\src\MyFrame.java6 组件:图形用户界面的最小单元,用来完成与用户的交互;

用户界面标准化的结果,例如:标签、文本框、按钮、菜单等。 使用组件的步骤:

1)创建组件类的对象,指定其属性;

2)使用某种布局策略;

3)将组件对象注册给对应的事件监听器,覆盖事件处理方 法,实现与用户交互的功能;组件7 用户自定义成分:如绘制几何图形、使用标志图案等。

通常只能起到装饰、美化的作用,不能响应用户的动作,不具有交互功能。用户自定义成分87.2绘制图形

利用Graphics类可以绘制文字及直线、矩形、多边形、圆和椭圆等各种图形。 对于Application程序:创建Canvas对象,并将它加入界面容器中。

Applet类和Canvas类都有一个paint()方法,系统会自动创建一个Graphics类的实例作为其参数,实现各种图形绘制;9Graphics类的常用绘图方法《例7-1》DrawFigures.java(p185)

drawLine(intx1,inty1,intx2,inty2):绘制直线

drawRect(intx,int

y,intwidth,intheight

):绘制矩形

fillRect(intx,inty,intwidth,intheight

):填充矩形

10设置字体—Font类 显示文字:Graphics类的drawString()方法,在屏幕的指定位置显示字符串。

Font类:表示一种字体,包含字体类型、字型和字号。如: Fontfnt=newFont(“TimesRoman”,Font.BOLD,12); Font类有三种字体:Font.PLAIN,Font.BOLD,Font.ITALIC。 使用字体:Graphics类的setFont()方法 如:g.setFont(fnt); btn.setFont(fnt);11《例7-2》AvailableFonts.JavaGraphicsEnviroment类: TheGraphicsEnvironmentclassdescribesthecollectionofGraphicsDeviceobjectsandFontobjectsavailabletoaJava(tm)applicationonaparticularplatform.12设置颜色—Color类Color类对象: 控制文字或图形的颜色;构造函数:publicColor(intRed,intGreen,intBlue);各参数取值范围:0~255publicColor(floatRed,floatGreen,floatBlue);参数取值范围:0.0~1.0publicColor(intRGB);参数的0~7位为红色分量,8~15位为绿色分量,16~23位为蓝色分量例:ColorblueColor=newColor(0,0,255);//问这是什么颜色?13颜色设置:Graphics类的setColor()方法使用自定义的颜色:

ColorblueColor=newColor(0,0,255); g.setColor(blueColor);使用Color类的颜色常量:

g.setColor(Color.black);Color类定义了13个静态颜色常量,包括:black(0,0,0) red(255,0,0) green(0,255,0)blue(0,0,255)等。14对GUI组件,可用下列方法设置或获取组件的背景色和前景色:publicvoidsetBackground(Colorc);publicColorgetBackground();publicvoidsetForeground(Colorc);publicColorgetForeground();《例7-3》UseColor.Java问题:HTML文件中的参数是以什么形式、如何传入字节码的?15显示图像一、获取图像:Applet类的getImage();publicImagegetImage(URLurl,Stringname)

该方法将指定图像文件的内容返回到Image对象。方法中的参数url是一个URL(统一资源定位器)地址,也就是图像所在网址。name是图像文件名。Java支持的图像文件格式包括bmp,gif,jpeg等。16二、绘制图像:drawImage(Imageimg,intx,inty,ImageObserverobserver) 有4个参数:图像的Image对象,显示图像的左上角x、y坐标,显示图像的容器对象。如:g.drawImage(image,10,10,this);《例7-4》DrawMyImage.java17实现动画效果 制作步骤:1)构造或获取动画的各帧; 2)绘制各帧; 动画的各帧可以用绘图的方法绘制,也可在给定关键帧的情况下,采用插值方法生成,还可以用getImage()方法获取文件中的gif或jpg格式图像。

例7-5:其中的paint()方法一次显示一幅图像,并调用Thread.

sleep()方法使程序休眠片刻,从而前一副图像在屏幕上暂留,再显示下一幅图像,形成动画。187.3Java的标准组件与事件处理每一个可以触发事件的组件被当作事件源。每一个事件都对应专门的监听者,监听者用来接收和处理这种事件。如果一个事件源注册了对应的监听者,那么这种事件就会被监听者接收和处理。这种模式称为“委托模型”。19Java的事件处理机制:委托事件模型事件源(可能产生事件的组件)注册:btn.addActionListener(监听者对象);ActionEvent事件监听者(负责监听并处理事件的对象)实现接口:publicvoidactionPerformed(ActionEvente);触发事件调用并传递参数注册图7-5委托事件模型20事件与监听者接口要注意以下问题:有哪些事件源,可能发生什么事件?将事件源注册给哪个监听者?监听接口包含什么方法?各代表对什么事件的处理?举例:见P215表格21AWT的事件处理模型:监听者对象是实现监听者接口的类的实例。事件源在事件发生时把事件对象发送给注册的监听者。监听者对象会使用事件对象中的信息来决定如何响应事件。注册监听者对象是通过调用事件源的.addXXXListener()来实现的。如下:eventSourceObject.addEventListener(eventListenerObject);22并非每个事件类都只对应一个事件,例如:KeyEvent类对应KEY_PRESSED,KEY_RELEASED,KEY_TYPED三个具体的事件。KeyEvent类的getID()可以返回不同的常量,以此来判断具体的事件类型。23以JButton为例,关心的事件就是按钮被按下,想注册该事件,就需要调用

JButton的addActionListener(

)

方法,该方法带一个参数--实现ActionListener接口的对象,ActionListener接口只包含一个actionPerformed(

)方法,所以,将实现的代码与JButton联系起来的方法就是在类里实现ActionListener接口,而且将该类的对象用JButton

的addActionListener(

)方法注册。这样actionPerformed(

)方法将在按钮被按下时被回调。24事件处理用内部类实现监听接口:见例子ButtonCounter.java将容器类实现监听接口:见例子FrameCounter.java定义专门的外部类实现监听接口:见例子OuterCounter.java采用事件适配器:见例子AdapterCounter.java,注意适配器是类,不是接口。25

7.4GUI标准组件概述ComponentButton组件名CanvasTextAreaTextFieldListScrollbarLabelTextComponentCheckboxChoiceContainerDialogFrameWindowAppletPanelScrollPane容器FileDialog图7-7AWT组件层次关系图26

Component类的常用方法publicvoidadd(PopupMenupopup):在组件上加上一个弹出菜单。publicColorgetBackground():获得组件的背景色。publicFontgetFont():获得组件使用的字体。publicColorgetForeground():获得组件的前景色。publicGraphicsgetGraphics():获得绘图用的Graphics对象。publicvoidrepaint(intx,inty,intwidth,intheight):以指点的坐标点为左上角,重画组件中指点宽、高的区域。publicvoidsetBackgound(Colorc):设置组件的背景色。publicvoidsetEnable(booleanb):设置组件的使能状态。publicvoidsetFont(Fontf):设置组件的字体。publicvoidsetSize(intwidth,intheight):设置组件大小。publicvoidsetVisible(booleanb):设置组件是否可见的属性。publicvoidsetForeground(Colorc):设置组件的前景色。publicvoidrequestFocus():使组件获得注意的焦点。27标签、按钮和动作事件1. 标签(Label)

标签类Label的对象用来显示文本信息。它不是事件源,不能引发事件。常用方法是getText()和setText(Strings)。按钮(Button)

Button

类的常用方法是getLabel()

和setLabel(Strings)。 按钮可以引发动作事件,如ActionEvent。为此,对应的监听者必须实现ActionListener

接口,并实现相应的actionPerFormed

(ActionEvente)

方法。28动作事件(ActionEvent)

ActionEvent

类只包含一个执行动作事件ACTION_PERFORMED。可触发该事件的动作包括:(1)按钮------点击;(2)列表中的某一选项------双击;(3)菜单项------选择;(4)文本框------回车;(5)定时器-经过一定的时间(acertainamountoftimehaselapsed

)29区分不同的事件源

Buttonbtn=newButton(“计算”);

btn.setActionCommand(“命令名”);

btn.addActionListener(this);//接口的动作响应方法

publicvoidactionPerformed(ActionEvente){if(e.getActionCommand()==“命令名”)//若无第2句,则用

if(e.getActionCommand()==“计算”)//或者用

if(e.getSource()==btn)……}30publicintgetModifiers():判断是否还按了Ctrl、Shift等功能键;该方法返回一个整数,可与ActionEvent类的静态常量ALT_MASK,SHIFT_MASK,CTRL_MASK,META_MASK比较,用来判断动作事件发生时,是否同时按下某个功能键。目的:将一个动作事件再细分成几个事件;31文本框、文本区域与文本事件

文本域(TextField)与文本区(TextArea)TextField是单行文本框,TextArea是多行文本区域。它们都是TextComponent的子类。创建

TextArea

txtArea=newTextArea(10,45);//10行25列的文本区

TextFieldname=newTextField(“卡号”,8);//初始字符串为“卡号”,可容纳8个字符32常用方法父类

TextComponent

的方法

getText():获取文本信息

setText(Stringtext):设置文本内容

setEditable(bolleanb):指定文本是否可编辑

isEditable():判断文本是否可编辑

select(intstart,intend):选择指定范围内的文本

selectAll():选定全部文本

setSelectionStart(intstart)和

setSelectionEnd(intend):设置选定文本的起、止位置

getSelectionStart()和getSelectionEnd():获得选定文本的起、止位置

getSelectText():获取选定文本的内容

33TextField类的特殊方法:setEchoChar(charc):设置回显字符,用在不希望如实回显的场合(如输入密码时)。getEchoChar():获取屏蔽当前文本域的回显字符。EchoCharIsSet():判断是否设置了屏蔽当前文本域的回显字符。

TextArea类的特殊方法:append(Strings):在已有文本后面添加字符串sinsert(Strings,intindex):将字符串s插入到指定序号处。34(3)事件响应

TextEvent

事件:该类包含代表文本变化(如删除或键入字符)的事件TEXT_VALUE_CHANGED;由TextField

和TextArea

的父类TextComponent

产生;要响应这个事件,程序应实现TextListener

接口,并实现响应该事件的方法:

publicvoidtextValueChanged(TextEvente);

调用e.getSource

可以获得引发该事件的文本域对象引用。

ActionEvent

事件:当用户在文本域按回车键时,可由TextField

对象产生这一事件。3536单、复选按钮,列表与选择事件选择事件(ItemEvent)

ItemEvent

类包含的是代表选择项的选中状态发生变化的事件

ITEM_STATE_CHANGED。引发这类事件的动作包括:(1)改变列表类List

对象选项的选择状态。(2)改变下拉列表类Choice

对象选项的选择状态。(3)改变复选按钮类Checkbox

对象的选择状态。(4)改变检测盒菜单项CheckboxMenuItem

对象的选择状态。37ItemEvent类的主要方法publicItemSelectable

getItemSelectable():返回引发选中状态变化事件的事件源,如选项或状态变化的List

、Choice

或Checkbox对象。publicObjectgetItem():返回引发选择状态变化的具体选择项(指“文本”),如选中的具体的item。publicint

getStateChange():返回选择状态的具体类型,其值包括

ItemEvent

.SELECTED(被选中)和

ItemEvent

.DESELECTED(不选)。38复选按钮(Checkbox检测盒)(1)创建(可同时指明其文本说明标签)Checkboxbcakg=newCheckbox(“背景色”);(2)常用方法getState()返回复选按钮的状态:选中(true)或未选中(false)。setState(booleanb)设置复选按钮的状态。39(3)事件响应将检测盒注册给ItemEvent事件监听者

ItemListener事件源.addItemListener(监听者);

实现接口方法,以响应检测盒状态变化publicvoiditemStateChanged(ItemEvente)

在方法体中,用e.getItemSelectable()方法获取事件源对象引用,再调用e.getState()方法获取选择状态。《例7-8》TestCheckbox.java4041单选按钮组(CheckboxGroup)单选按钮组是一组Checkbox的集合(每个Checkbox对应一种情况),用CheckboxGroup类的对象表示。例如,下述语句创建一个CheckboxGroup,三个Checkbox对象,并设置从属关系:CheckboxGroupcheckboxGroup1=newCheckboxGroup();Checkboxcheckbox1=newCheckbox();checkbox1.setCheckboxGroup(checkboxGroup1);Checkboxcheckbox2=newCheckbox();checkbox2.setCheckboxGroup(checkboxGroup1);Checkboxcheckbox3=newCheckbox();checkbox3.setCheckboxGroup(checkboxGroup1);4243事件响应CheckboxGroup类是Object类的直接子类,不能响应事件,但可由组中的每个Checkbox对象响应

itemStateChanged类的事件。44下拉列表(Choice)(1)创建包括创建Choice对象和添加选项两步:size=newChoice(); //创建下拉列表size.add(“10”); //添加选项size.add(“16”);size.add(“20”);(2)常用方法getSelectedIndex():返回被选项的序号getSelectedItem():返回被选项的标签文本字符select(intindex)、select(Stringitem)选中指定序号或文本内容的选项add(Stringitem)和insert(Stringitem,intindex):将新选项item加在下拉列表的最后或指定的序号处。remove(intindex)和remove(Stringitem):删除指定序号或指定标签文本的选项。removeAll():删除所有选项4546列表(List)(1)创建列表可以实现“多选多”(复选)。构造函数包括:publicList

();publicList

(introws);publicList

(introws,booleanmultipleMode);其中,rows

为可同时显示的选项(Item)个数,

multipleMode指明是否允许复选。缺省时不允许复选。创建列表时,也要同时添加选项:ListMyList=newList(5,true);MyList.add(“北京”);MyList.add(“上海”);47(2)常用方法getSelectedItem():返回被选项目的文本。getSelectedItems():返回包含所有被选项目的字符串数组。getSelectedIndex():返回被选项目的序号。getSelectedIndexs():返回由所有被选项目的序号组成的整型数组。select(intindex)和deselect(intindex):选中或不选指定序号的选项。add(Stringitem):将标签为item的项目加至列表的最后。add(Stringitem,intindex):将标签为item的项目加至指定序号处。remove(intindex):删除指定序号处的选项。48(3)事件响应产生的事件:

itemStateChanged:单击某一选项;

actionPerformed:双击某一选项;要响应这两种事件,必须将列表注册给相应的事件监听者。list1.addItemListener(newApplet1_list1_itemAdapter(this));list1.addActionListener(newApplet1_list1_actionAdapter(this));并实现相应的接口及方法。《例7-11》TestList.java49507.7设计事件处理专用类7.7.1内部类外部类可以使用自己的内部类,比如创建内部类的对象并调用其方法。内部类能访问外部类中定义的所有属性和方法。517.7.2用内部类实现事件处理例子见前面。527.7.3焦点事件FocusEvent类包含两个具体事件:FOCUS_GAINED,FOCUS_LOST。FocusListener监听者接口定义了两个方法:publicvoidfocusGained(FocusEvente)publicvoidfocudLosted(FocusEvente)组件与焦点有关的方法:requestFocus()hasFocus()53滚动条与调整事件调整事件(AdjustmentEvent)

AdjustmentEvent

类只包含一个表示

GUI组件发生连续变化的事件

ADJUSTMENT_VALUE_CANGED,当用户操纵滚动条

(Scrollbar)或其子类组件,改变滑块位置时,引发这一事件。

AdjustmentEvent

类的主要方法:publicAdjustablegetAdjustable():返回引发状态变化的事件源。publicint

getAdjustmentType():返回事件的状态变化类型,其值包括:TRACK(拖动滑块)、UNIT_DECREMENT(点击下三角按钮,引发最小单位下移)、UNIT_INCREMENT(点击上三角按钮,引发最小单位上移)。

publicint

getValue():返回状态变化后滑块对应的当前数值。54滚动条(Scrollbar)(1)创建

ScrollbarmySlider=newScrollbar(Scrollbar.HORIZONTAL,50,1,0,100);其中,参数1指明滚动条方向,Scrollbar.HORIZONTAL

为水平方向,Scrollbar.VERTICAL为垂直方向。参数2为滑块的初始位置,整型量。参数3为滑块的大小。参数4、5分别为滑块代表的最小和最大数据。(2)常用方法

setUnitIncrement(intunit):指定单位增量,即单击两端的三角按钮时的数据改变。

setBlockIncrement(int

blk):指定块增量,即单击滚动槽时的数据改变。

getValue():返回当前滑块位置代表的整数值。55《例7-12》TestSlider.Java56画布与鼠标、键盘事件鼠标事件(MouseEvent)

MouseEvent

类包含7个鼠标事件:MOUSE_CLICKED:鼠标点击事件MOUSE_DRAGGED:鼠标拖动事件MOUSE_ENTERED:鼠标进入事件MOUSE_EXITED:鼠标离开事件MOUSE_MOVED:鼠标移动事件MOUSE_PRESSED:鼠标按钮按下事件MOUSE_RELEASED:鼠标按钮松开事件

MouseEvent

事件的监听者MouseListener

和MouseMoveListener

中有7个方法,与上述事件对应。系统会根据具体事件类型,自动调用相关的方法。

MouseEvent

类的主要方法

getX()和getY():分别返回鼠标事件的X和Y坐标。

getPoint():返回包含鼠标事件坐标的Point对象。

getClickCount():返回鼠标点击事件的点击次数。57键盘事件(KeyEvent)

KeyEvent

类包含3种键盘事件:

KEY_PRESSED:按键被按下

KEY_RELEASED:按键被松开

KEY_TYPED:按键被敲击KeyEvent

类的主要方法:

publicchargetKeyChar():返回与引发事件的按键对应的Unicode字符。

publicStringgetKeyText():返回引发事件的按键的文本内容,如“F3”、“Home”、“A”等。与KeyEvent

事件对应的监听者接口是KeyListener,该接口的3个方法是:

publicvoidkeyPressed(KeyEvente);publicvoidkeyReleased(KeyEvente);publicvoidkeyTyped(KeyEvente);58画布(Canvas)---用来画图的矩形背景组件。(1)创建

CanvasmyCanvas=newCanvas();

myCanvas.setSize(400,300);(2)常用方法

publicvoidpaint(Grapicsg):用户须覆盖该方法以实现图形绘制。(3)产生事件可引发键盘和鼠标事件。《例7-14》TestCanvas

.java

程序中使用了事件裁剪类MouseAdapter

和MouseMotionAdapter。使用事件裁剪类作为父类的目的是不用实现对应监听者接口包含的所有方法。因为事件裁剪类已经用空方法体实现了对应监听者的所有方法(见p224)。5960

publicvoidpaint(Graphicsg){

g.drawString("您在("+X+","+Y+")至"+"("+endX+","+endY+")画了一条线",10,20);

g.drawLine(X,Y,endX,endY);}voidthis_mousePressed(MouseEvente){X=e.getX();Y=e.getY();

showStatus("您在("+X+","+Y+")开始画线");}voidthis_mouseReleased(MouseEvente){

endX=e.getX();

endY=e.getY();

showStatus("画线结束");repaint();}617.10布局设计组件在容器中的位置和尺寸都是由布局管理器来决定的。取消布局管理器:setLayout(null);默认布局管理器:Window,Frame和Dialog的默认布局管理器是BorderLayout。Panel和Applet的默认布局管理器是FlowLayout。62布局管理器共5种:FlowLayout:流式边界管理器BorderLayout:边界边界管理器GridLayout:网格布局管理器CardLayout:卡片布局管理器GridBagLayout:网格包布局管理器637.10.1FlowLayoutFlowLayout

:组件按加入顺序自左至右排列,一行排满,转下一行。特征:不限制组件的大小,允许它们有自己的最佳大小。当容器被缩放时,组件的位置可能会变化,但组件的大小不变。例子:MyFlow.java647.10.2BorderLayout把容器空间划分为东、西、男、北、中五个区域。加入组件时,应指明所加区域。《例7-17》TestBorderLayout.java657.10.3CardLayout

可在容器中加入多个组件,但各组件相互重叠,每次只能显示其中一个。使用CardLayout的一般步骤:(1)创建CardLayout对象:card=newCardLayout();(2)用容器的setLayout()方法设置布局管理器:setLayout(card);(3)为组件分配一个字符串名,并加入组件:add(字符串名,组件);(4)调用CardLayout的show()方法,根据字符串名显示组件:show(容器名,字符串),或按加入顺序显示组件,如first(容器名)、last(容器名)、next

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论