第十一章、图形用户界面总论:本章学习图形界面的初步知识,包括图形界面的概述,容器类,布局管理器,辅助类,绘图等知识点。1、图形界面的概述Java中有两个包负责图形界面的构建:swing和awt。awt包中的类主要是调用当前操作系统的组件来实现GUI编程,特点是速度快,但是跨平台性很差,称为重型组件。swing包中的类主要是模拟组件来实现GUI编程,由于是模拟组件,所以他的速度较慢,但跨平台性很好.称为轻型组件,swing包的类都以J开头,以示和awt包中的类进行区分2、GUI类分为三组:容器类(Jframe、jpanel、jdialog)、组件类(Jbutton、jlabel)和辅助类(Font、graphics、color、dimension、fontmetrics)这些类都是java设计人员精心设计的类,供我们直接使用。3、所有图形界面组件的关系如下:Awt中的component类是所有swing和awt类的根类Awt中的container类是所有容器类的根类Swing中的所有组件类(组件)均继承自jcomponent类辅助类和component类一样,继承自object,属于awt包第一节.容器类与布局管理器1、容器,即可以盛放其他组件的组件。主要有如下几个:Object辅助类ComponentContainerLayoutmanagerWindows和panelJcomponentJframeJappletJdialog红色区域为awt包,粉色区域为swing包Container:一个容器类,他的实例常用作接受其他的容器引用。Jframe:框架(窗体),类似于Windows系统中的窗口。Jdialog:用来设计对话框。2、JFrame类该类的对象即是一个窗口,其构造方法可以带参数(窗体名字),也可以不带参数。该类有一系列的方法可以调用。见下例:例子:JFrame的基本用法(1)生成一个窗口(2)能够关闭生成的窗口(3)让窗口居中(4)加上一个按钮(5)窗口和按钮上的文字所有的图形界面类都是先生成对象,然后通过对象的方法来设置界面每个类方法众多,记住最常用的,知道有其他的,边用边学。要随时查看API手册。本例子的方法有:设置大小,添加组件,删除组件,设置位置,关闭窗口等Dimension是一个类,用来把一个对象的高和宽封装到一个Dimension对象中Toolkit是一个工具类,能够提供一系列的方法。这里获得屏幕尺寸课本上添加组件的方法3.布局管理器(1)布局是Java中用来控制组件排列位置的一种界面管理系统。Java界面设计没有提供所见即所得的设置组件坐标的方法(netbeans可以做到所见即所得)。Java本身提供的布局管理系统来完成组件布局的任务,而且在跨平台时表现得更有优势。(2)先创建一个布局实例,然后使用setLayout方法把该布局实例和某个容器绑定到一起,这样该容器就拥有这种布局方式了。FlowLayoutlayout=newFlowLayout(LlowLayout.LEFT,10,20)container.setLayout(layout)第一句话是生成一个布局管理器对象,他规定了界面如何布局第二句话是给某个容器添加该布局管理器对象,这样该容器就具有这种布局了。上式我们可以简洁写成:container.setLayout(newFlowLayout(LlowLayout.LEFT,10,20))设置好布局后,那么在往该容器组件上添加组件就会按照布局的设定的添加。(3)常用的布局有:·FlowLayout布局:只需要把组件加入到FlowLayout中,FlowLayout就会根据你添加组件的顺序依次放置组件,如果空间不够,会自动换行。该布局有三个常量来指定组件的对齐方式:FLOWLayout.RIGHT、FLOWLayout.CENTER和FLOWLayout.LEFT。此外还有三个构造方法:PublicFLOWLayout(intalign,inthGap,intvGap)该方法根据指定的对齐方式、水平间距和垂直间距构造一个新的FLOWLayout对象,间距的单位是像素。PublicFLOWLayout(intalign)只是指定的对其方式,水平和垂直间距默认为5像素PublicFLOWLayout()没有任何指定,则对齐方式默认居中,水平和垂直间距默认为5像素例子:ShowFlowLayout·GridLayout:将用户界面切割为棋盘一样的布局管理系统。如果我们要设计一个类似于Windows中自带的计算器软件,GridLayout无疑是最佳选择。其构造方法:PublicGridLayout(introws,intclolumns,inthGap,intvGap)该方法根据指定的行数和列数来构造安排对象,但是行列不可同时为0如果行列其一为0,那么不为零的固定,为零的由布局管理器动态的决定,如果行列均不为零,那么行是主要参数,列会动态决定。若没有水平和垂直参数则默认为0,若没有行列参数则默认一行。例子:GridLayOut·BorderLayout:将界面分割为上下左右以及中间一块区域的管理系统,在BorderLayout布局中,最多你只能放5个组件,如果超过5个组件,建议还是选用其他的布局系统可以使用add(componet,index)方法把组件添加到布局管理器中,其中index是一个常量有:BorderLayout.EAST,SOUTH,WEST,NORTH,CENTER五个。构造方法两个:PublicBorderLayout(inthGap,intvGap)PublicBorderLayout()例子:BorderLayOut第二节.面板和在面板上绘图一些较为复杂的界面用上述的布局管理器很难完成,需要配合JPanel容器才可以做到1、JPanel类:面板,一种容器,不可见,可以盛放其他组件,一般我们把面板放到窗体上,然后把其他组件放到面板上,这样可以做出复杂的界面。例子:TestJPanel2、在JPanel上绘图JPanel除了可以作为容器,还可以在其上绘图。JPanel有一个paintComponent方法,该方法提供了画笔类(Graphics),拿到画笔我们就可以绘图了例子:draw继承了JPanel类,那么就可以重写他的paintComponent方法。在该方法里提供了画笔,我们利用画笔的各种方法来绘图。绘图方法有g.drawString(你好,40,40);画出一个字符串,提供参数字符串和字符串的出现位置。g.drawLine(20,20,40,40);画一条直线,提供参数直线的起点和终点g.drawOval(50,50,10,10);画一个圆或者椭圆,提供参数圆的邻接矩形的左上角坐标,和高宽。g.drawRect(10,10,20,20);画一个矩形,提供参数矩形的左上角点的坐标和矩形的高宽。g.drawArc(150,100,50,50,0,90);画一个弧,提供参数和圆一样,只是多了两个弧度参数即起始角和生成角的弧度。g.drawPolygon(x,y,4);画一个多角形,提供参数多角形顶点的坐标数组和顶点个数。还可以画出有填充色的图形g.fillOval(80,80,50,50);画一个带有填充色的圆draw画出的图形都没有填充色,fill画出的都有以上画图颜色都是黑色,即默认色,可以设置画笔颜色g.setColor(Color.red);Color是一个辅助类,显示颜色。以后讲第三节.辅助类辅助类包括字体,颜色等设置。如下:(1)颜色类Color使用java.awt.color类为GUI组件设置颜色,颜色表示可以用三原色分量表示,即r,g,b三个原色取值范围是0—255,任意组合构成一中颜色。也可以用一些常量来表示:共13种(black,blue,cyan,darkGray,gray,green,lightGray,magenta,orange,pink,red,white,yellow)。下面例子分别使用了两个方法设置颜色:ColorDemo.java(2)字体类Font使用java.awt.font类创建并使用字体对象,该类构造方法是Font(StringfontName,intfontStyle,intpointSize)在这里,参数fontname指定了希望使用的字体的名字。这个名字既可以是逻辑名也可以是外形名。所有的Java环境都将支持如下的字体:Dialog,DialogInput,SansSerif,Serif,Monospaced,以及Symbol。Dialog是你的系统对话框使用的字体。如果你不明确的指定字体,Dialog也是默认的字体。你也可以用任何其他被你的特殊环境支持的字体,但是请小心,这些字体未必都是可用的。字体的样式是由参数fontstyle指定的。它可以由Font.PLAIN,Font.BOLD以及Font.ITALIC这三个常量中的一个和多个组成。为了结合各种样式,可以把它们用or连接在一起。例如,Font.BOLD|Font.ITALIC指定了一个由粗体和斜体组成的样式。以磅为单位的字体,大小由pointsize指定。为了使用你创建的字体,你必须通过调用setFont()方法来选择该字体例子:FontDemo(3)Dimension类Dimension类将组件的宽度和高度封装在一个单个对象中实践为了让大家练习图形界面的制作,从本节课开始,我们以连连看游戏的界面为目标,做一个类似的界面。今天先做一部分,后面随着课程的深入逐步改进,直到完成这个界面,但是游戏功能不具体实现连连看游戏界面如下:由于容器组件中可以放置其他组件,因此,我们只需要先确定放置的容器组件。然后进入布局管理系统的选择。这里选择BorderLayout,如下图所示。作业:连连看界面1学生提的问题:1、JFrame的背景色不能设置JFrameframe=newJFrame();frame.getContentPane().setBackground(Color.red);2、标题栏图标如何修改frame.setIconImage(newImageIcon(d:/2.jpg).getImage());