Java 教案第12章 GUI初步复习过程Word下载.docx
《Java 教案第12章 GUI初步复习过程Word下载.docx》由会员分享,可在线阅读,更多相关《Java 教案第12章 GUI初步复习过程Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
当Java问世的时候,称AWT(AbstractWindowsToolkit)的GUI类就被绑定在类库中。
对于开发简单的图形用户界面,AWT是胜任的,但如果开发综合,复杂的GUI工程却力不从心。
另外,AWT是依赖于平台的,即AWT组件的样式与它使用的底层平台相似。
新版本中,许多AWT的用户界面组件被一个更鲁棒,灵活,通用的Swing组件代替。
Swing组件使用Java代码编写,被直接应用在程序上,而不是调用底层的平台服务。
但java.awt.Window或java.awt.Panel的子类除外,因为他们必须使用特定平台本地的GUI来绘制。
Swing组件很少依赖目标平台,很少使用平台下的本地GUI程序,鉴于此,把它称为轻量级组件,而AWT称为重量级组件。
为了和AWT组件进行区分,Swing组件的类命名加前缀J,尽管AWT组件依然被现在版本的Java支持,但最好使用轻量级组件,因为AWT最终会淡出历史舞台,也因此,只介绍Swing组件。
.3JavaGUI与API
GUI的API包含的类可以被分为3类,组件类,容器类,帮助类。
它们的层次关系如图所示。
组件类,如Jbutton等用来创建用户界面。
容器类,如Jframe,Jpanel和Japplet等用来盛载其他组件。
帮助类,如Graphics,Color等用来支持GUI组件。
注意:
Jframe,Japplet,Jdialog和Jcomponent类和它们的子类被组织在Javax.swing包中,其他的类被组织在AWT包中。
12.3.1Component类
Component的实例可以被显示在屏幕上。
Component是所有用户界面类的根类(父类),包含Container类。
Jcomponent类是所有轻量级组件的根类。
Componet和Jcomponent都是抽象类(14章讲解)。
现在只需要知道抽象类和类相似,仅仅是不能创建实例就可以了。
例如,不可以使用newJComponent()来创建一个Jcomponent对象,但可以使用它非抽象子类的构造方法来创建Jcomponent实例。
熟练掌握继承的层次关系非常重要,如下述语句都显示true。
12.3.2Container类
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组件的特性,属性,如下图所示。
帮助类在AWT包中,Swing组件不能替换所有的AWT,它替换的只有AWT的GUI组件类,因此AWT帮助类仍然在GUI编程中用处很大。
.4Frames框架
为了创建用户界面,需要创建一个frame或一个applet(18章介绍)容器来放置用户界面组件。
12.4.1创建Frame
使用Jframe类来创建一个框架frame,如下所示。
使用Jframe创建一个frame窗口,如下程序。
框架frame的可见性默认为false,因此必须使用frame.setVisible(true)来显示框架。
语句frame.setSize(400,300),设置框架窗口宽400,高300像素,如果不设置大小,则只显示一个标题栏,运行程序后在屏幕显示如下。
Line7使得frame在屏幕中间显示,line8告诉程序当frame被关闭时终止,没有此语句,程序将不能终止,这种情况下只能在Dos(windows平台)命令提示符下,使用Ctrl+C来终止,在Eclipse中将使用红色终止按钮来终止程序。
要在调用居中语句前设置窗口大小,否则无效。
12.4.2在Frame中添加组件
使用add方法可以为Frame添加组件,如图所示程序。
每一个JFrame都包含一个contentpane(内容面板),内容面板是Container的一个实例。
如按钮等GUI组件会被放置在frame的contentpane中。
在Java早期版本,必须使用getContentPane方法来返回frame的contentpane,然后调用contentpane的add方法为其添加组件,如下所示(教程中示例如此)。
这是非常笨重的,从java5以后的新版本允许直接调用frame的add方法来为contentpane添加组件,如下:
这个新特性称content-pane授权(给frame),严格的说,是一个组件被添加到frame的contentpane。
为简单,称把组件添加到frame中。
一个JButton对象使用newJbutton(“OK”);
来创建,使用frame.add(jbtOK)被添加到frame的contentpane中。
方法add(Compunentcomp)定义在Container类中,因为JButton是Component的子类,因此Jbutton的实例同样也是Component的实例,从容器中删除组件使用remove方法,使用方式:
Container.remove(jbtOK);
当运行程序时,窗口会被显示,按钮会总是出现在窗口中间,不管窗口是否重新设置大小,总是占据整个窗口。
原因就是组件被contentpane的不仅管理器放置在窗口中,contentpane的默认的布局管理器会把这个按钮放置在窗口的中央。
下节会学习使用其他几种布局管理器,把组件放置在期望的位置。
.5布局管理器
介绍3种布局管理器,FlowLayout,GridLayout和BorderLayout。
12.5.1FlowLayout
FlowLayout是最简单的布局管理器,称流式布局管理器。
组件被从左到右,从上到下的,按它被添加的顺序放置在窗口中。
当一行满之后,会另起一行。
类中包含三个常量,设置组件的对齐方式,FlowLayout.RIGHT,FlowLayout.CENTER,FlowLayout.LEFT。
也可以使用分割线来分割组件,如下所示FlowLayout类图:
下列程序给出一个流式布局,添加三个标签和三个文本框。
为什么使用如上程序来构造一个窗口?
原因有三:
1.创建一个GUI应用意味着创建一个窗口框架,很自然会定义成Jframe的子类。
2.frame会被扩展出新的组件或方法函数。
3.这个类易于重用,例如可以通过创建多个类的实例来创建多个窗口。
同时这种构造程序的方式易读。
从今以后,大多数GUI主类会扩展JFrame类,主类的构造方法会构造用户界面。
主方法创建一个主类的实例并显示窗口框架。
这个例子中FlowLayout布局管理器用来放置组件,如果重新调整窗口大小,组件也会自动被重新安排,如上图所示。
如果把line10语句用setLayout(newFlowLayout(FlowLayout.RIGHT,0,0))来替换,所有组件会被左对齐,并且中间没有间隔线。
等价语句如下:
假设把一个按钮用add方法加入10次,是否会出现10个相同的按钮?
答案是不会,只会出现一个。
不要忘记在设置布局中使用new,如setLayout(newFlowLayout()).
12.5.2GridLayout
GridLayout也称网格布局(矩阵布局),组件按被添加的先后顺序放置在网格中,放置顺序从左到右,从上到下,如下是网格布局类的UML类图。
可以设定网格的行和列数,基本原则如下:
1.行数或列数可以为0,但不能都为0.如果一个为0,另外一个不为0,那么非0的维数被设定,0维数由布局管理器动态决定。
如,设置0行3列,包含10个组件,那么GridLayout会创建固定的3列,并动态生成4行,最后一行包含一个组件。
如果设定3行0列,10个组件,那么固定为3行,动态设定4列,最后一行包含2个组件。
2.如果行和列都不为0,行数为主导参数,即行数被固定,列数自动计算生成。
如果设定3行3列,10个组件,那么会设置3行固定,4列动态设定,最后一行包含2个组件。
如下列所示程序使用网格布局。
如果重新设定框架大小,布局的按钮保持不变,网格布局中所有的组件给出相同的大小。
把line10用setLayout(newGridLayout(3,10))来替换,仍然是3行,2列。
如果定义4行2列网格或2行2类网格会怎样?
自己试验下。
前2种布局,添加组件顺序非常重要,因为它决定自己在容器中的位置。
12.5.3BorderLayout
BorderLayout把容器分为5个区域,东南西北中。
通过add(Component,index),添加组件,其中index是以下5个常数之一,BorderLayout.EAST,BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.NORTH或BorderLayout.CENTER,类图如下图所示。
组件以合适的大小被放置在相应的区域,南北组件可以水平方向延伸,东西组件可以垂直方向延伸,中间组件可以向水平,垂直方向延伸以填满整个空间。
如下程序可以说明BorderLayout的布局,在东南西北中添加5个按钮,标签分别为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,setColumns,setHgap和setVgap方法来设定行数,列数即水平和垂直分割。
BorderLayout有hgap和vgap属性,可以使用setHgap和setVgap方法来设置水平和垂直分割。
在前面的部分中,因为没有设置布局管理器属性,匿名的布局管理器在发挥作用。
如果需要动态的改变属性,那么布局管理器就必须显式被一个变量引用,不能匿名。
可以通过变量改变布局管理器的属性值,例如下述代码。
.6Panels面板和子容器
假设想要在一个框架中放置是个按钮和一个文本框,按钮按网格布局,但文本框要放置在分开的一行。
单单使用一个容器很难达到预期要求。
但可以把容器分成几个部分