《Java备课教案-第12章GUI初步.doc》由会员分享,可在线阅读,更多相关《Java备课教案-第12章GUI初步.doc(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、,第12章 GUI初步12.1 介绍(Introduction)为JavaGUI程序设计应用程序接口(API)是面向对象编程最精彩的内容,图形用户界面(GUI)可以通过键盘或鼠标来响应用户的操作。这章首先介绍GUI编程基础,然后用GUI来讲述面向对象编程,特别是要讲框架和组件的关系,包括容器,布局管理器,颜色,字体,边框和图标等。12.2 Swing和AWT前面第8章,稍微介绍了一些面向对象编程的GUI例子,显示GUI组件,使用了诸如Jbutton,Jlabel等GUI组件。为什么这些GUI前会有一个J?为什么不用Button?事实上,在java.awt包中已经有一个名为Button的类。当J
2、ava问世的时候,称AWT(Abstract Windows Toolkit)的GUI类就被绑定在类库中。对于开发简单的图形用户界面,AWT是胜任的,但如果开发综合,复杂的GUI工程却力不从心。另外,AWT是依赖于平台的,即AWT组件的样式与它使用的底层平台相似。新版本中,许多AWT的用户界面组件被一个更鲁棒,灵活,通用的Swing组件代替。Swing组件使用Java代码编写,被直接应用在程序上,而不是调用底层的平台服务。但java.awt.Window或java.awt.Panel的子类除外,因为他们必须使用特定平台本地的GUI来绘制。Swing组件很少依赖目标平台,很少使用平台下的本地GU
3、I程序,鉴于此,把它称为轻量级组件,而AWT称为重量级组件。为了和AWT组件进行区分,Swing组件的类命名加前缀J,尽管AWT组件依然被现在版本的Java支持,但最好使用轻量级组件,因为AWT最终会淡出历史舞台,也因此,只介绍Swing组件。12.3 Java GUI与 APIGUI的API包含的类可以被分为3类,组件类,容器类,帮助类。它们的层次关系如图所示。组件类,如Jbutton等用来创建用户界面。容器类,如Jframe,Jpanel和Japplet等用来盛载其他组件。帮助类,如Graphics,Color等用来支持GUI组件。注意:Jframe,Japplet,Jdialog和Jco
4、mponent类和它们的子类被组织在Javax.swing包中,其他的类被组织在AWT包中。12.3.1 Component类Component的实例可以被显示在屏幕上。Component是所有用户界面类的根类(父类),包含Container类。Jcomponent类是所有轻量级组件的根类。Componet和Jcomponent都是抽象类(14章讲解)。现在只需要知道抽象类和类相似,仅仅是不能创建实例就可以了。例如,不可以使用new JComponent()来创建一个Jcomponent对象,但可以使用它非抽象子类的构造方法来创建Jcomponent实例。熟练掌握继承的层次关系非常重要,如下述
5、语句都显示true。12.3.2 Container类Container类的实例可以盛载Component的实例,是GUI组件,它用来盛载其他GUI组件的。Window,Panel,Applet,Frame和Dialog都是AWT组件的容器类。为了配合Swing组件,使用Container,Jframe,Jdialog,Japplet和Jpanel类容易,如下图所述。12.3.3 帮助类如Graphics,Color,Font,FontMetrics,Dimension和LayoutManager等类是帮助类,它们不是Component的子类。它们用来描述GUI组件的特性,属性,如下图所示。注
6、意:帮助类在AWT包中,Swing组件不能替换所有的AWT,它替换的只有AWT的GUI组件类,因此AWT帮助类仍然在GUI编程中用处很大。12.4 Frames框架为了创建用户界面,需要创建一个frame或一个applet(18章介绍)容器来放置用户界面组件。12.4.1 创建Frame使用Jframe类来创建一个框架frame,如下所示。使用Jframe创建一个frame窗口,如下程序。框架frame的可见性默认为false,因此必须使用frame.setVisible(true)来显示框架。语句frame.setSize(400,300),设置框架窗口宽400,高300像素,如果不设置大小
7、,则只显示一个标题栏,运行程序后在屏幕显示如下。Line 7使得frame在屏幕中间显示,line8告诉程序当frame被关闭时终止,没有此语句,程序将不能终止,这种情况下只能在Dos(windows平台)命令提示符下,使用Ctrl+C来终止,在Eclipse中将使用红色终止按钮来终止程序。注意:要在调用居中语句前设置窗口大小,否则无效。12.4.2 在Frame中添加组件使用add方法可以为Frame添加组件,如图所示程序。每一个JFrame都包含一个content pane(内容面板),内容面板是Container的一个实例。如按钮等GUI组件会被放置在frame的content pane
8、中。在Java早期版本,必须使用getContentPane方法来返回frame的content pane,然后调用content pane的add方法为其添加组件,如下所示(教程中示例如此)。这是非常笨重的,从java 5以后的新版本允许直接调用frame的add方法来为content pane添加组件,如下:这个新特性称content-pane授权(给frame),严格的说,是一个组件被添加到frame的content pane。为简单,称把组件添加到frame中。一个JButton对象使用new Jbutton(“OK”);来创建,使用frame.add(jbtOK)被添加到frame的
9、content pane中。方法add(Compunent comp)定义在Container类中,因为JButton是Component的子类,因此Jbutton的实例同样也是Component的实例,从容器中删除组件使用remove方法,使用方式:Container.remove(jbtOK);当运行程序时,窗口会被显示,按钮会总是出现在窗口中间,不管窗口是否重新设置大小,总是占据整个窗口。原因就是组件被content pane的不仅管理器放置在窗口中,content pane的默认的布局管理器会把这个按钮放置在窗口的中央。下节会学习使用其他几种布局管理器,把组件放置在期望的位置。12.5
10、 布局管理器介绍3种布局管理器,FlowLayout,GridLayout和BorderLayout。12.5.1 FlowLayoutFlowLayout是最简单的布局管理器,称流式布局管理器。组件被从左到右,从上到下的,按它被添加的顺序放置在窗口中。当一行满之后,会另起一行。类中包含三个常量,设置组件的对齐方式,FlowLayout.RIGHT, FlowLayout.CENTER, FlowLayout.LEFT。也可以使用分割线来分割组件,如下所示FlowLayout类图:下列程序给出一个流式布局,添加三个标签和三个文本框。为什么使用如上程序来构造一个窗口?原因有三:1. 创建一个GU
11、I应用意味着创建一个窗口框架,很自然会定义成Jframe的子类。2. frame会被扩展出新的组件或方法函数。3. 这个类易于重用,例如可以通过创建多个类的实例来创建多个窗口。同时这种构造程序的方式易读。从今以后,大多数GUI主类会扩展JFrame类,主类的构造方法会构造用户界面。主方法创建一个主类的实例并显示窗口框架。这个例子中FlowLayout布局管理器用来放置组件,如果重新调整窗口大小,组件也会自动被重新安排,如上图所示。如果把line10语句用setLayout(new FlowLayout(FlowLayout.RIGHT,0,0)来替换,所有组件会被左对齐,并且中间没有间隔线。等
12、价语句如下:假设把一个按钮用add方法加入10次,是否会出现10个相同的按钮?答案是不会,只会出现一个。不要忘记在设置布局中使用new,如setLayout(new FlowLayout().12.5.2 GridLayoutGridLayout也称网格布局(矩阵布局),组件按被添加的先后顺序放置在网格中,放置顺序从左到右,从上到下,如下是网格布局类的UML类图。可以设定网格的行和列数,基本原则如下:1. 行数或列数可以为0,但不能都为0.如果一个为0,另外一个不为0,那么非0的维数被设定,0维数由布局管理器动态决定。如,设置0行3列,包含10个组件,那么GridLayout会创建固定的3列,
13、并动态生成4行,最后一行包含一个组件。如果设定3行0列,10个组件,那么固定为3行,动态设定4列,最后一行包含2个组件。2. 如果行和列都不为0,行数为主导参数,即行数被固定,列数自动计算生成。如果设定3行3列,10个组件,那么会设置3行固定,4列动态设定,最后一行包含2个组件。如下列所示程序使用网格布局。如果重新设定框架大小,布局的按钮保持不变,网格布局中所有的组件给出相同的大小。把line10用setLayout(new GridLayout(3,10)来替换,仍然是3行,2列。如果定义4行2列网格或2行2类网格会怎样?自己试验下。前2种布局,添加组件顺序非常重要,因为它决定自己在容器中的
14、位置。12.5.3 BorderLayoutBorderLayout把容器分为5个区域,东南西北中。通过add(Component, index),添加组件,其中index是以下5个常数之一,BorderLayout.EAST,BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.NORTH或BorderLayout.CENTER,类图如下图所示。组件以合适的大小被放置在相应的区域,南北组件可以水平方向延伸,东西组件可以垂直方向延伸,中间组件可以向水平,垂直方向延伸以填满整个空间。如下程序可以说明BorderLayout的布局,在东南西北中添加5个
15、按钮,标签分别为East,South,West,North和Center。不必要使得组件填满所有的5个区域,如果把East按钮移调,并重新运行程序,会发现中间的按钮会向右延伸并占满East区域。如果add方法中没指明区域,则默认为中间区域,如此添加2个组件,则只有第二个组件会被显示。12.5.4 布局管理器属性布局管理器有动态调整的属性。FlowLayout有alignment,hgap,vgap属性。可以使用setAlignment,setHgap和setVgap方法来设定对齐和垂直,水平分割。GrideLayout有rows,columns,hgap和vgap属性,可以使用setRows,
16、 setColumns,setHgap和setVgap方法来设定行数,列数即水平和垂直分割。BorderLayout有hgap和vgap属性,可以使用setHgap和setVgap方法来设置水平和垂直分割。在前面的部分中,因为没有设置布局管理器属性,匿名的布局管理器在发挥作用。如果需要动态的改变属性,那么布局管理器就必须显式被一个变量引用,不能匿名。可以通过变量改变布局管理器的属性值,例如下述代码。12.6 Panels面板和子容器假设想要在一个框架中放置是个按钮和一个文本框,按钮按网格布局,但文本框要放置在分开的一行。单单使用一个容器很难达到预期要求。但可以把容器分成几个部分,每个部分中放置
17、一个panel,每个panel有不同的布局方式。Panel是组织界面组件的一个非常有效的子容器,需要先把组件添加到panel上,然后再把panel添加到frame上。Swing版本的panel是JPanel。Jpanel的默认布局方式为FlowLayout布局,但可以在创建对象时给定它的布局方式,如new JPanel(LayoutManager)。如下方式添加按钮到Panel中。Panel可以被放置在frame中或另外一个panel中,如下把panel添加到frame中。f.add(p);下述代码展示了使用panel作为子容器来创建一个微波炉的用户界面。setLayout方法定义在Conta
18、iner类中。Jpanel是Container的子类,因此可以使用setLayout方法来设置panel的布局方式。为了获得想要的布局,程序使用panel p1,网格布局方式来组织数字按钮,start和stop按钮。面板p2,布局方式为BorderLayout,放置一个文本框在north区域,而面板p1放置center区域。注意:值得注意的是Container类是所有其他GUI组件类的超类,每一个GUI组件都是一个容器,理论上将,可以使用setLayout方法设置按钮上面的布局方式,添加一个组件到按钮上面,因为所有的Container当中的公共方法都被遗传到JButton类中,但在实践上,却不
19、会想到把按钮作为容器。12.7 Color类使用AWT包中的Color类可以为GUI组件设置颜色,颜色是由红绿蓝光的三原色组件构造的,每个组件是一个整型值表达梯度(明亮和灰暗程度),从0-255,这就是所谓的RGB颜色模式。可以使用如下构造方法创建一个颜色对象:r,g,b分别表示红绿蓝颜色的梯度值(不能超过255,否则会出错),如Color color=new Color(128,100,100);可以使用setBackground(Color c)和setForeground(Color c)方法来设置组件类对象的背景颜色和前景颜色。如下设置一个按钮的背景和前景色。另外,可以使用13个标准颜
20、色(颜色常量BLACK,BLUE, CYAN, DARK_GRAY, GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED, WHITE, YELLOW)定义颜色对象,如下设置按钮前景色:12.8 Font类使用awt包中的Font类设置组件的字体样式。Font类的构造方法:Public Font(String name, int style, int size);可以选择字体名字,如SansSerif,Serif,Monospaced,Dialog或DialogInput,可以选择字体,如Font.PLAIN(0),Font.BOLD(1),
21、 Font.ITALIC(2), Font.BOLD+ Font.ITALIC(3),用正整数来设定字体大小,如图所示下例。注意:如果系统支持其他字体,诸如“Times New Roman”,可以使用它来创建一个字体对象。为了找到系统中可用的字体,需要得到一个java.awt.GraphicsEnviroment类的实例,调用它的静态方法getLocalGraphicsEnvironment()。这个类是一个抽象类,描述特定系统的图形环境的,可以使用它的getAllFonts()方法获得当前系统可用的所有字体,如下程序代码。12.9 Swing GUI组件的一般属性已经使用过几个GUI组件(如
22、JFrame,Container, JPanel, JButton, JLabel, JTextField)除了这些组件,还有很多其他的GUI组件,因此了解SwingGUI组件的一般特性非常重要。Component类是所有GUI组件和容器类的根类。所有的Swing GUI组件(除JFrame,JApplet,JDialog)都是JComponent的子类。如图列出Comonent,Container,和Jcomponent类常用的用于操纵属性诸如font,color,size等方法。一个tooltip(提示工具)是当把鼠标移动到组件上时组件上的文本显示,通常描述组件的作用。可以设置JCompo
23、nent类任何对象的边框。Swing有几种类型的边框,new TitledBorder(String title)创建标题边框,new LineBorder(Color color, int width)创建线框,width是线的粗细。如下图,程序创建一个panel面板p1,上面放置3个按钮和一个面板p2,上面放置2个label标签,按钮jbtLeft的背景颜色设置为白色,按钮jbtCenter的前景色设置为绿色。按钮jbtRight的文本提示“This is the Right button”,标题边框设置在p1和p2上,线框被设置在label标签上。注意:对于不同的组件,相同的属性会有不同
24、的默认值,例如,visible属性在JFrame上默认是false,但对于JComponent的任何实例,它的值却是true。12.10 Image Icons图标是一个固定大小的图像,它很小,通常用来点缀组件,图像通常被保存在图像文件中,java目前支持3中格式的图片:GIF,JPEG,PNG,它们的扩展名为.gif, .jpg或.jpeg, .png。如果有一个bmp(windows支持的图像格式)文件或其他格式的图像,应该使用软件转换为java可用的三种图像格式。要想显示一个图标,首先应该使用new javax.swing.ImageIcon(filename)创建一个ImageIcon
25、对象,如下使用当前目录中image文件夹下的us.gif文件创建图标。其中image/us.gif的具体位置为:e:javaimageus.gif,反斜杠是windows的路径标识,在Unix中是正斜杠,在Java中,正斜杠用来表示相对文件路径(相对于java classpath)。注意:在windows操作系统中,文件名不区分大小写,而在Unix中是区分大小写的。为了确保程序在任何平台都能运行,命名所有的图像文件通常用小写。图标可以使用new JLabel(imageIcon)或new JButton(imageIcon)显示在按钮或标签上。如下例所示,使用图标创建2个标签和2个按钮。注意:GUI组件不能被容器共享,一个GUI组件在同一个时间只能出现在一个容器中。因此组件和容器是组合关系。边框和图标可以共享,因此可以创建一个边框或图标,并为任意的GUI组件设置border或icon属性。如下左图为2个面板p1和p2设置边框b,右图为2个按钮jbt1和jtb2设置图标。