java8图形用户界面设计概述.ppt
第第8章章图形用户界面设计概述图形用户界面设计概述现现代代的的应应用用程程序序早早已已进进入入图图形形时时代代,命命令令行程序只在特殊的时候才会使用。行程序只在特殊的时候才会使用。Java提供了丰富的类用来生成图形用户接提供了丰富的类用来生成图形用户接口(口(GraphicalUserInterface,GUI)。)。本章将讲述本章将讲述JavaGUI的发展、的发展、AWT的构成、的构成、布局管理器的应用及布局管理器的应用及Java的事件处理模的事件处理模型。型。18.1AWT概述概述Java1.0包包含含一一个个用用于于GUI编编程程的的类类库库,叫叫抽抽象象窗窗口工具箱口工具箱(AbstractWindowToolkit,AWT)。Java.awt包包中中最最核核心心的的类类是是Component类类,是是构构成成Java图图形形用用户户界界面面的的基基础础,所所有有其其他他组组件件都都是是从从Component类派生出来的。类派生出来的。注意注意:Component类是一个抽象类,不能直接使用。类是一个抽象类,不能直接使用。在在Componen类类中中定定义义了了AWT组组件件具具有有的的一一般般功功能能如如大大小小和和位位置置控控制制,外外形形控控制制,组组件件的的状状态态控控制制等等2大小和位置控制大小和位置控制一一个个组组件件的的大大小小和和位位置置可可以以通通过过组组件件提提供供的的一一些些方方法法来来指指定定,相相应应的方法包括的方法包括setSize()、setLocation()等。等。外形控制外形控制可可以以通通过过getFont()、setFont()、setForeground()等等方方法法设设置置组组件件中中的字体、颜色等。的字体、颜色等。基本绘画支持基本绘画支持方方法法repaint()、paint()、update()用用于于在在屏屏幕幕上上绘绘制制组组件件,AWT绘绘图系统通过一个单独的线程控制程序何时进行组件的绘制。图系统通过一个单独的线程控制程序何时进行组件的绘制。组件的状态控制组件的状态控制提提供供的的有有关关组组件件状状态态控控制制方方面面的的方方法法有有:setEnable()、isEnable()、isVisible()等。等。从从Component类派生出来的类派生出来的Container类用于表示类用于表示GUI中的容器,该中的容器,该类具有的功能是组件管理和布局管理。类具有的功能是组件管理和布局管理。在组件管理中,包含的方法有在组件管理中,包含的方法有add()、remove()、getComponent()等,等,分别用于添加组件、删除组件和获得某个组件。分别用于添加组件、删除组件和获得某个组件。38.2AWT基本组件基本组件为为了了方方便便大大家家进进行行图图形形用用户户界界面面设设计计,本本节节介介绍绍AWT基本组件。基本组件。实实际际上上一一个个图图形形用用户户界界面面就就是是由由一一些些AWT基基本本组组件组成的。件组成的。按钮(按钮(Button)按按钮钮是是AWT中中最最常常见见的的一一种种组组件件,用用户户可可以以通通过过单击操作,单击操作,如如果果希希望望按按钮钮响响应应用用户户的的单单击击操操作作,就就需需要要实实现现相关的鼠标单击事件,相关的鼠标单击事件,(8.5节节)按钮组件的生成方式如下:按钮组件的生成方式如下:Buttonbutobj=newButton(OK)上面的语句生成了一个标记文字为上面的语句生成了一个标记文字为OK的按钮。的按钮。4复选框(复选框(Checkbox)单选框(单选框(RadioButton)复选框和单选框组件都提供简单的复选框和单选框组件都提供简单的“on/off”开关开关单选框之间同一单选框之间同一时刻只能有一个时刻只能有一个被选中被选中一组复选框之间没有一组复选框之间没有特定的约束关系,可特定的约束关系,可以有任意个复选框被以有任意个复选框被同时选中同时选中5复选框对象的生成方法复选框对象的生成方法checkbox chbobj=new checkbox(one、null、true);第一个参数是复选框的文本标签第一个参数是复选框的文本标签;第二个参数为复选框的组名第二个参数为复选框的组名,组名为空组名为空,表示生成的对象是复选框表示生成的对象是复选框第第三三个个参参数数代代表表复复选选框框对对象象的的状状态态,ture表表示示生生成成的的复复选选框框对对象象为为选选中中状状态态,false表表示示非非选选中状态。中状态。6CheckboxGroupcbgobj=newCheckboxGroup();Checkboxc1=newCheckbox(one,cbgobj,true);Checkboxc2=newCheckbox(two,cbgobj,false);文本标签:显示在对象上文本标签:显示在对象上复选框组复选框组:组名不为空组名不为空,表示生成的对象是单选框表示生成的对象是单选框复复选选框框对对象象状状态态:ture表表示示生生成成的的复复选选框框对对象象为为选选中中状态状态,false表示非选中状态。表示非选中状态。单选框对象的生成方法单选框对象的生成方法生成复选框组对象生成复选框组对象生成复选框对象生成复选框对象格式:格式:Checkboxname=newCheckbox(文本标签文本标签,复选框组复选框组,复选框对象状态复选框对象状态);7下拉式菜单(下拉式菜单(Choice)下下拉拉式式菜菜单单适适用用于于有有大大量量选选项项同同时时又又需需要要节节省省窗窗口口面面积积的的情况,每次只能选择下拉式菜单中的一项。情况,每次只能选择下拉式菜单中的一项。下拉式菜单对象的生成方式如下:下拉式菜单对象的生成方式如下:choicechoiObj=newChoice();choiObj.add(class1);choiObj.add(class2);choiObj.add(class3);以上生成了包含有以上生成了包含有class1、class2和和class3的下拉式菜单。的下拉式菜单。标签(标签(Lable)标标签签可可以以说说是是最最简简单单的的一一种种组组件件,用用于于在在界界面面上上显显示示一一行行文字,生成方式如下:文字,生成方式如下:LabellabObj=newLabel(Bookname);上面的语句生成了一个标记文字为上面的语句生成了一个标记文字为Bookname的标签。的标签。8单行文本输入区(单行文本输入区(TextField)的几种生成方法的几种生成方法/生成一个空的单行文本输入区生成一个空的单行文本输入区TextFieldtfObj1=newTextField();/生成一个列数为生成一个列数为5的单行文本输入区,的单行文本输入区,TextFieldtfObj2=newTextField(5);/生成一个文本内容为生成一个文本内容为name的单行文本输入区的单行文本输入区TextFieldtfObj3=newTextField(name);/生成一个文本内容为生成一个文本内容为name且列数为且列数为5的单行文本输入区的单行文本输入区TextFieldtfObj4=newTextField(name,5);注意注意:TextField只能显示一行只能显示一行9文本输入区(文本输入区(TextArea)TextArea用于显示多行多列的文本信息,生成方式如下:用于显示多行多列的文本信息,生成方式如下:TextAreataObj=newTextArea(Hi,3,20);在在上上面面的的语语句句中中,第第一一个个参参数数表表示示初初始始字字符符,第第二二个个和和第第三个参数分别表示行数和列数。三个参数分别表示行数和列数。列数(列数(List)列列表表用用于于将将多多个个文文本本选选项项显显示示在在一一个个区区域域中中,用用户户可可以以同同时查看若干个选项。时查看若干个选项。ListLobj=newList(2,false);/显示行数,是否允许多选。显示行数,是否允许多选。Lobj.add(Sun);/在在list中添加选项中添加选项SunLobj.add(“Moon”);/在在list中添加选项中添加选项Moon10滚动窗口(滚动窗口(ScrollPane)是是一一种种容容器器,不不能能单单独独使使用用,可可以以将将其其他他组组件件添添加加到到滚滚动动窗口中。窗口中。ScrollpanespObj=newScrollpane();/生成滚动窗口生成滚动窗口spObj.add(pObj);/在滚动窗口中加入对象在滚动窗口中加入对象pObj菜单(菜单(Menu)菜菜单单和和其其他他组组件件不不同同,不不能能直直接接添添加加到到容容器器中中某某一一位位置置,可以添加到菜单条或其他菜单中。可以添加到菜单条或其他菜单中。菜菜单单条条(MenuBar)是是一一种种水水平平菜菜单单,只只能能添添加加到到Frame对对象中,作为菜单树的根基。象中,作为菜单树的根基。下面是菜单条对象生成和添加到下面是菜单条对象生成和添加到Frame对象中的示例语句:对象中的示例语句:FramefrObj=newFrame(Frametitle);MenuBarmbObj=newMewMenuBar();frObj.setMenuBar(mbObj);11在在Java中中,类类Mune提提供供了了标标准准的的下下拉拉菜菜单单,生生成成的的菜菜单单对对象象可可以以被添加到菜单条和其他菜单中。被添加到菜单条和其他菜单中。FramefrObj=newFrame(Frametitle);MenuBarmbObj=newMenuBar();frObj.setMenuBar(mbObj):MenumbObj1=newMenu(File);MenumbObj2=newMenu(Edit);mbObj.add(mbobj1);mbObj.add(mbobj2);一一个个菜菜单单通通常常包包含含多多个个菜菜单单项项,菜菜单单项项对对象象生生成成后后,通通常常需需要要添添加加到相应的菜单中,如下示:到相应的菜单中,如下示:Memumobj=newMenu(File);MenuItemmiobj1=newMenuItem(Open);MenuItemmiobj2=newMenuItem(Save);mobj.add(miobj1);mobj.add(miobj2);128.3 AWT容器容器(容器(Container)是是Component的子类的子类因因此此容容器器本本身身也也是是一一个个组组件件,它它具具有有组组件件的的所所有有性质,而且还具有容纳其他组件和容器的功能。性质,而且还具有容纳其他组件和容器的功能。本节将介绍本节将介绍Java中最常用的两种容器:中最常用的两种容器:Frame和和Panel,其他容器请参阅其他容器请参阅java的相关文档。的相关文档。138.3.1 FrameFrame类是类是Window类的子类类的子类它它也也是是一一种种窗窗口口,具具有有标标题题属属性性,可可以以按按照照常常用用窗口一样调整大小。窗口一样调整大小。可以将组件和面板添加到其中。可以将组件和面板添加到其中。java.awt.Componentjava.awt.Container java.awt.Frame 图图81Frame类的继承关系层次图类的继承关系层次图14Frame对象的生成对象的生成可可 以以 通通 过过 Frame类类 的的 构构 造造 方方 法法 Frame(StringstrObj)生生 成成 Frame对对 象象,Frame的的 标标 题题 由由String类型的参数类型的参数StrObj指定,指定,注注意意,这这种种方方法法生生成成的的Frame对对象象默默认认情情况况下下是是不可见的,初始大小为(不可见的,初始大小为(0,0)。)。可可以以通通过过setVisible和和setSize方方法法设设置置Frame的的可可见性和大小。见性和大小。下下面面的的语语句句生生成成一一个个标标题题为为“FrameExample”、大小为大小为260160的可见的可见Frame。FramefrObj=newFrame(FrameExample);FrObj.setSize(260,160);fr.setVisible(true);158.3.2 PanelPanel和和Frame一一样样,都都是是容容器器,也也可可以以将将组组件件和其他面板添加到和其他面板添加到Panel中,中,与与 Frame不不 同同 的的 是是,Panel对对 象象 必必 须须 被被 放放 入入Window和和Frame中中才才能能可可见见,通通常常是是使使用用add()方法将方法将Panel添加到添加到Window和和Frame中。中。java.awt.Container 图图82Panel类的继承关系层次图类的继承关系层次图16下下面面的的语语句句将将生生成成的的Panel对对象象添添加加到到Frame中中,为为了了将将两两者者区区分分开开,Panel对对象象的的背背景景设设置置为为红红色。色。FramefrObj=newFrame(FrameExample);PanelpPbj=newPanel();pPbj.setSize(100,80);pPbj.setBackground(Color.red);frobj.setSize(260,160);frObj.add(pObj);frObj.setVisible(ture);178.4 布局管理器布布局局管管理理器器(layoutmanager)是是用用来来安安排排容容器器中中多多个个组组件件的的位位置置及及大大小小,以以确确保保GUI中中各各组组件件能安排在适当的位置。能安排在适当的位置。Java中的布局类型包括以下几种:中的布局类型包括以下几种:FlowLayout(流式布局)BorderLayout(边界布局)GridLayout(网格布局)CardLayout(卡片布局)BoxLayout(框布局)GridBagLayout(网格包布局)18简单简单GUI程序程序1 1java.awtjava.awt包包 称为抽象窗口工具集称为抽象窗口工具集AWTAWT(Abstract Window Abstract Window ToolkitToolkit),),是使用是使用JavaJava进行进行GUIGUI设计的基础。设计的基础。2 2javax.swingjavax.swing包包 Swing Swing组件存放在组件存放在javax.swingjavax.swing包中。几乎所有包中。几乎所有AWTAWT组件对应有新功能更强的组件对应有新功能更强的SwingSwing组件。另外还加入组件。另外还加入了一些全新的组件。了一些全新的组件。SwingSwing组件在名称上前面多了组件在名称上前面多了一个字母一个字母“J”J”。19简单简单GUI程序程序设置设置GUIGUI应用程序的流程:应用程序的流程:(1 1)引用需要的包和类。)引用需要的包和类。(2 2)设置一个顶层的容器。)设置一个顶层的容器。(3 3)根据需要为容器设置布局管理器或使用)根据需要为容器设置布局管理器或使用默认布局管理器。默认布局管理器。(4 4)将组件添加到容器内,位置自行设计。)将组件添加到容器内,位置自行设计。(5 5)为响应事件的组件编写事件处理代码。)为响应事件的组件编写事件处理代码。20容器、组件、布局和观感容器、组件、布局和观感1.容器和组件容器和组件组件是可以用图形化的方式显示在屏幕上并能组件是可以用图形化的方式显示在屏幕上并能够与用户进行交互的对象。够与用户进行交互的对象。容器是一种特殊的组件,一种能够容纳其他组容器是一种特殊的组件,一种能够容纳其他组件或容器的组件。件或容器的组件。2.布局管理器布局管理器为了使图形用户界面具有良好的平台无关性,提为了使图形用户界面具有良好的平台无关性,提供了专门用来管理组件在容器中的布局的工具。供了专门用来管理组件在容器中的布局的工具。3.观感观感决定应用程序的外观。决定应用程序的外观。218.4.1 FlowLayout流流布布局局管管理理器器提提供供了了一一种种非非常常简简单单的的布布局局,用用来来将一群组件置于一行。将一群组件置于一行。它是它是JPanel的默认布局管理器。的默认布局管理器。流流布布局局管管理理器器会会将将组组件件安安排排在在同同一一行行(由由左左向向右右排排列列)并并维维持持组组件件原原本本所所定定义义的的大大小小,当当此此行行已已经经排排满满时时,他他会会将将剩剩余余的的组组件件自自动动排排列列到到下下一行,而各行的组件会向中间对齐一行,而各行的组件会向中间对齐也也可可以以通通过过使使用用常常量量LEFT、CENTER或或RIGHT来改变默认地对齐方式来改变默认地对齐方式22FlowLayout常用的构造函数常用的构造函数FlowLayout():生成一个生成一个FlowLayout对象。对象。FlowLayout(intalign):生生成成一一个个FlowLayout对对象象并并指指定定对对齐齐方方式式(LEFT,CENTER,RIGHT),默默认认为为CENTER。FlowLayout(int align,int hgap,int vgap):生生成成一一个个FlowLayout对对象象并并指指定定对对齐齐方方式式、同同一一行行各各组组件件之之间的间距(默认间的间距(默认5像素)以及行间距(默认像素)以及行间距(默认5像素)。像素)。FlowLayoutFlowLayout的一些常用的方法:的一些常用的方法:setAlignment(intalign):制定组件对齐的方式。制定组件对齐的方式。setHgap(intgap):指定同一行各组件的距离。指定同一行各组件的距离。setVgap(intgap):指定各行之间的距离。指定各行之间的距离。23例例8-1 8-1 流布局管理器流布局管理器效果:设置祖父类(效果:设置祖父类(window)的默认构造函数为的默认构造函数为window(FlowLayout)JFrame类的getContentPane248.4.2 BorderLayout边边框框布布局局管管理理器器可可以以将将组组件件安安置置在在5 5个个不不同同的的区区域域,它它们们分分为为东东、南南、西西、北北、中中,分分别别用用常常量量EAST,SOUTH,WEST,NORTHEAST,SOUTH,WEST,NORTH和和CENTERCENTER表示。表示。注注意意,每每个个区区域域只只能能放放置置一一个个组组件件,若若将将组组件件置置于已有组件的区域,则原组件将被取代。于已有组件的区域,则原组件将被取代。与与流流布布局局管管理理器器不不同同的的是是,各各区区域域的的组组件件并并不不一一定定会会维维持持原原来来定定义义的的大大小小,而而是是会会充充满满各各区区域域所提供的空间。所提供的空间。常用的构造函数如下:常用的构造函数如下:BorderLayout()BorderLayout():生成一个生成一个BorderLayoutBorderLayout对象。对象。BorderLayout(int hgap,int vgap):生成一个生成一个BorderLayout并指定组件间的水平和垂直间距。并指定组件间的水平和垂直间距。25例例8-2 8-2 边框布局管理器边框布局管理器26278.4.3 GridLayout网网格格布布局局管管理理器器会会根根据据指指定定的的行行列列数数目目将将一一个个容容器器分分割割成成几几个个一一样样大大小小的的方方形形区区域域,每每个个区区域域只只能能放放置置一一个个组组件件,而而每每个个组组件件会会完完全全使使用用该该区域所能使用的空间。区域所能使用的空间。常用的构造函数常用的构造函数如下:如下:GridLayout():GridLayout():生生成成一一个个网网格格布布局局管管理理器器,所所有有组组件件会会排排列列于于同同一一列列,而而组组件件间间的的间间隔隔为为零零(默认值)。(默认值)。GridLayout(int GridLayout(int rows,rows,int int cols):cols):生生成成具具有有rowsrows行和行和colscols列的网格布局管理器。列的网格布局管理器。GridLayout(introws,intcols,inthgap,intvgap):生成具有生成具有rows行和行和cols列并指定行间距为列并指定行间距为hgap,列间距为列间距为vgap的网格布局管理器。的网格布局管理器。28例例8-3 8-3 GridLayout.javaGridLayout.javaPack():Causes this Window to be sized to fit the preferred size and layouts of its subcompone298.4.4 CardLayout卡卡片片布布局局管管理理器器可可以以让让一一群群组组件件使使用用相相同同的的空空间间,如如同同一叠卡片,只有最上边的可以被看到。一叠卡片,只有最上边的可以被看到。常用的构造函数如下:常用的构造函数如下:CardLayout():CardLayout():生成一个卡片布局管理器。生成一个卡片布局管理器。CardLayout(int CardLayout(int hgap,hgap,int int vgap):vgap):生生成成一一个个卡卡片片布布局局管理器,并指定卡片内组件之间的空间。管理器,并指定卡片内组件之间的空间。其他常用的方法如下:其他常用的方法如下:first(Container parent):first(Container parent):显示容器的第一个组件。显示容器的第一个组件。last(Container parent):last(Container parent):显示容器的最后一个组件。显示容器的最后一个组件。next(Container parent):next(Container parent):显示容器的下一个组件。显示容器的下一个组件。previous(Container parent):previous(Container parent):显示容器的前一个组件。显示容器的前一个组件。show(Containerparent,Stringname):显示容器中名字为显示容器中名字为name的组件。必须先指定各组件的名字。的组件。必须先指定各组件的名字。30例例8-48-4 提问:为什么容器和面板要分别设定布局?容器是什么?里面包含什么?面板是什么?里面包含什么?31328.4.5 8.4.5 BoxLayoutBoxLayout框框布布局局管管理理器器也也是是用用来来将将一一群群组组件件排排列列在在一一起起,除除了了至左而右的排列方式,还提供由上而下的排列方式。至左而右的排列方式,还提供由上而下的排列方式。和和流流布布局局不不同同的的是是,当当空空间间不不够够时时,组组件件不不会会自自动动往往下移。下移。框布局的构造函数:框布局的构造函数:BoxLayout(Container BoxLayout(Container target,target,int int axis):axis):axisaxis是是用用来来指指定定组组件件排排列列的的方方式式(X_AXISX_AXIS水水平平排排列列;Y_AXISY_AXIS垂垂直排列)。直排列)。可使用可使用3 3种隐藏的组件做间隔种隐藏的组件做间隔:strut:strut:用来在组件之间插入固定的空间。用来在组件之间插入固定的空间。glue:glue:用来控制一个框布局内额外的空间。用来控制一个框布局内额外的空间。rididarea:用来生成一个固定大小的区域。用来生成一个固定大小的区域。33例例8-5 8-5 348.4.6 GridBagLayout网网格格袋袋布布局局管管理理器器相相对对于于其其他他布布局局管管理理器器是是非非常常有有弹弹性性的的,相相对对使使用用上上也也是是最最复复杂的。杂的。网网格格袋袋布布局局使使用用的的基基本本单单位位为为cellcell,一一个个组组件件可可以以占占一一个个以以上上的的cellcell,一一个个组组件件占有的区域称为该组件的显示区域。占有的区域称为该组件的显示区域。各各组组件件的的放放置置方方式式由由限限制制决决定定,这这些些定定义义在在GridBagConstraintsGridBagConstraints对象中对象中35例子例子8-636