(续上)
8.2.8文本区... 16
(一)文本区的构造方法... 17
(二)文本区的常用方法... 17
(三)创建文本区... 17
8.3组件布局管理... 18
8.3.1FlowLayout 流动布局... 18
FlowLauout的构造和使用... 19
8.3.2GirdLayout网格布局... 19
(一)GirdLayout的构造方法... 19
(二)GirdLayout的使用... 19
8.3.3BorderLayout边界布局... 21
(一)BorderLayout的构造方法... 21
(二)边界布局的使用... 21
8.3.4CardLayout卡片布局... 22
(一)CardLayout的构造方法... 23
(二)CardLayout的使用... 23
8.3.5GridBagLayout网袋布局... 24
(一)GridBagLayout的构造方法... 24
(二)GridBagLayout的使用... 24
8.3.6手工布局... 26
8.4 面板... 27
8.4.1panel的构造方法... 27
8.4.2面板控制... 27
8.5 小结... 29
8.6习题... 29
第8章 可视化编程(一)
8.2.8文本区
TextArea 对象与TextField对象不同的是,TextArea可以显示多行。可以将它设置为允许编辑或只读
(一)文本区的构造方法
① TextArea()构造一个将空字符串作为文本的新文本区
② TextArea(int rows, int columns)构造一个新文本区,该文本区具有指定的行数和列数,并将空字符串作为文本
③ TextArea(String text)构造具有指定文本的新文本区
④ TextArea(String text, int rows, int columns)构造一个新文本区,该文本区具有指定的文本,以及指定的行数和列数
⑤ TextArea(String text, int rows, int columns, int scrollbars)构造一个新文本区,该文本区具有指定的文本,以及指定的行数、列数和滚动条可见性
说明:text – 要显示的文本;如果text为null,则显示空字符串 “”;Rows – 行数;如果rows小于0,则将rows设置为0;Colums – 列数;如果columns小于0,则将columns设置为0;Scrollbars – 确定为查看这文本区创建的滚动条类型的常量,scrollbars参数仠提供的常量有:SCROLLBARS_BOTH(), SCROLLBARS_VERTICAL_ONLY,SCROLLBARS_HORIZONTAL_ONLY,SCROLLBARS_NONE
(二)文本区的常用方法
① Public void append(String str)将给定文本追加到文本区的当前文本
② Public void setEditable(boolean b)设定文本区的可编辑状态
③ Public int getColumns()返回此文本区中的列数
④ Public int getRows()返回此文本区的行数
⑤ Public void insert(String str, int pos)在此文本区的指定位置插入指定文本
⑥ Public void setColumns(int columns)设置此文本区的列数
⑦ Pulbic void setRows(int rows)设置此文本区的行数
(三)创建文本区
【例8.7】创建两个不同的文本区,程序名为TATest.java,代码如下所示。
package bedeck;
import java.awt.*;
import java.applet.*;
public class TATest extends Applet{
TextArea ta1 = new TextArea("文本区的默认内容,这是一个可编辑的文本区",10,20); //构造一个10行,10列且带默认值的文本区
TextArea ta2 = new TextArea("文本区的默认内容,这是一个不编辑的文本区",10,20,TextArea.SCROLLBARS_VERTICAL_ONLY); //构造一个10行,10列且带默认值的文本区,并显示垂直滚动条
public void init(){
/*
* 把组件添加到applet默认的窗口中
* */
ta2.setEditable(false); //设置文本区不可以编辑
this.add(ta1);
this.add(ta2);
}
}
|
说明:程序中第一个文本区是可编辑的,并如果字符串的宽度超过指定的宽度,则自动出现相应的滚动条,就相当于把TextArea ta2 = new TextArea("文本区的默认内容,这是一个不编辑的文本区",10,20,TextArea.SCROLLBARS_VERTICAL_ONLY)的四个参数设为SCROLLBARS_BATH。
运行结果如8-9所示
8-9 文本区
【注意】列是近似平均字符宽度,它与平台有关
8.3组件布局管理
在上面的所有例子中,组件的位置都是由容器的默认布局管理器摆放,也就是applet小程序的缺省布局管理器(FlowLayout),为了防止组件较多的组件在窗口凌乱显示,所以在这一章讲解如何去控制组件的摆放位置,学了这一小结,你就可以按照你自己的意愿去摆放这些组件
8.3.1 FlowLayout流动布局
FlowLayout流动布局,能常称为顺序布局,是其中最基本的一种布置,是面板(Panel)和它的子类Applet的缺省布局管理器,前面介绍的例子都使用了这种布局管理器,面板是一个容器,可以容纳多个组件;Applet是它的子类,也继承了能容纳组件的能力。
顺序布局是指将一个个组件从左到右依次、从上到下依次排列,每个组件所占的空间依据各组件所指定的合适尺寸来安排,当一行容纳不下时,便自动安排在下一行。
在顺序布局方式下,一个组件使用容器的add方法就可以把自己加入到容器的组件队列中,由于顺序布局功能有限,不能很好地按制组件的排列,所以常用在组件较少的情况下,组件较多时可采用其他布局方式,可使用容器的setLayout方法改变组件布局方式
① FlowLayout();
② FlowLayout(int align)
③ FlowLayout(int align,int hgap,int vgap)
④ setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 40))
⑤ setLayout(new FlowLayout(FlowLayout.LEFT))
8.3.2 GirdLayout网格布局
网格布局(GridLayout)是把容器区域分为若干个网络,每一个网格可以放置一个组件。当改变容器大小后,其中的组件相对位置不变,但大小改变。容器中各个组件同高度、同宽度。各个组件的排列方式为:从上到下、从左到右一次排列。
Grid布局管理器总是忽略组件的最佳大小。所有单元的宽度是相同的,是根据单元数对可用宽度进行平分而定的。同样地,所有单元的高度是相同的,是根据行数对可用高度进行平分而定的
(一)GirdLayout的构造方法
① GridLayout()创建具有默认值的网格布局,即每个组件占据一行一列
② GridLayout(int rows, int cols)创建具有指定行数和列数的网格布局
③ GridLayout(int rows, int cols, int hgap, int vgap)创建具有指定行数和列数的网格布局
(二)GirdLayout的使用
【例8.8】创建一个带六个按钮并且带有规定好行数和栏数的Grid布局程序名为GLTest.java,代码如下所示
package bedeck;
import java.awt.*;
import java.applet.*;
public class GLTest extends Applet{
Button b1,b2,b3,b4,b5,b6,b7,b8,b9;
GridLayout gl = new GridLayout(3,3);
/*
* 初始化applet程序
* */
public void init(){
this.setLayout(gl); //设置布局的方式
/*
* 对button进行初始化
* */
b1 = new Button("文本一");
b2 = new Button("文本二");
b3 = new Button("文本三");
b4 = new Button("文本四");
b5 = new Button("文本五");
b6 = new Button("文本六");
b7 = new Button("文本七");
b8 = new Button("文本八");
b9 = new Button("文本九");
/*
* 把组件添加到默认的applet窗口中
* */
this.add(b1);
this.add(b2);
this.add(b3);
this.add(b4);
this.add(b5);
this.add(b6);
this.add(b7);
this.add(b8);
this.add(b9);
}
}
|
说明:如果添加的组件超过和少于网格布局的数目,那么您超过和少于的组件则系统自动排列,但不会影响网格布局的外观。
运行如果如8-10所示
8-10 网格布局
【注意】因为有Border布局管理器,组件相应的位置不随区域的缩放而改变。只是组件的大小改变
8.3.3BorderLayout边界布局
边界布局(BorderLayout)是窗口类(Window,Frame,Dialog和FileDialog)的缺省布局管理器。
Border布局管理器为在一个Panel或Window中放置组件提供一个更复杂的方案。Border布局管理器包括五个明显的区域:右东左西上北下南和居中 。
当拉伸使用BordLayout布局管理器的容器,各个组件相对位置不变,中间部分组件的尺寸会发生变化,East和West位置的组件的宽度不变,高度随着改变,而South和North位置的组件的高度不变,宽度随之改变
(一)BorderLayout的构造方法
① BorderLayout()构造一个组件之间没有间距的新边界布局
② BorderLayout(int hgap, int vgap)用指定的组件之间的水平间距构造一个边界布局
(二)边界布局的使用
【例8.9】使用边界布局向Applet容器中添加5个按钮,程序文为BorderTest.java,代码如下所示:
package bedeck;
import java.applet.*;
import java.awt.*;
public class BorderTest extends Applet{
/*
* 实例化五个按钮
* */
Button buttonN,buttonS,buttonW,buttonE,buttonC;
public void init(){
buttonN = new Button("北");
buttonS = new Button("南");
buttonW = new Button("西");
buttonE = new Button("东");
buttonC = new Button("中");
/*
* 设置布局方式
* */
this.setLayout(new BorderLayout());
this.add("North", buttonN);
this.add("South",buttonS);
this.add("East", buttonE);
this.add("West",buttonW);
this.add("Center",buttonC);
}
}
|
说明:程序中this关建字可以省略不写,直接用add(参数)就可以了,比如说add(“North”,buttonN);add(“South”,buttonS)…………,上面的程序代码也可以写成如下这样,运行结果是一样的
package bedeck;
import java.applet.*;
import java.awt.*;
public class BorderTest extends Applet{
public void init(){
setLayout(new BorderLayout());
add(new Button("北"), BorderLayout.NORTH);
add(new Button("南"),BorderLayout.SOUTH);
add(new Button("东"), BorderLayout.EAST);
add(new Button("西"), BorderLayout.WEST);
add(new Button("中"),BorderLayout.CENTER);
}
}
|
运行结果如8-11所示
8-10 边界布局
【注意】在add方法中,第一个参数表示组件的摆放位置必须是North, South,East,West,Center中选择一个。
8.3.4CardLayout卡片布局
CardLayout 对象是容器的布局管理器。它将容器中的每个组件看作一张卡片。一次只能看到一张卡片,而容器充当卡片的堆栈。当容器第一次显示时,第一个添加到 CardLayout 对象的组件为可见组件。
卡片的顺序由组件对象本身在容器内部的顺序决定。CardLayout 定义了一组方法,这些方法允许应用程序按顺序地浏览这些卡片,或者显示指定的卡片
(一)CardLayout的构造方法
① CardLayout()创建一个间隙大小为 0 的新卡片布局
② CardLayout(int hgap, int vgap)创建一个具有指定的水平和垂直间隙的新卡片布局
(二)CardLayout的使用
【例8.9】创建卡片布局
package bedeck;
import java.awt.*;
import java.applet.*;
public class GLTest extends Applet{
CardLayout card = new CardLayout();
/*
* 初始化applet程序
* */
public void init(){
this.setLayout(card);
this.setFont(new Font("Arial",Font.PLAIN,24));
/*
* 创建5张卡片
* */
for(int i = 1 ; i < 6 ; i ++){
this.add(String.valueOf(i),new Button("第"+i+"卡片"));
}
card.show(this, String.valueOf(1));
}
}
|
说明:由于本实例没有向组件中事件,所以用户只能看到一张卡片,且不能进行卡片中进行跳转。
运行结果如8-12所示
8-12 卡片布局
8.3.5GridBagLayout网袋布局
GridBagLayout是所有AWT布局管理器当中最复杂的,同时他的功能也是最强大的.这种现象源于它所提供的众多的可配置选项,你几乎可以完全地 控制容器的布局方式.尽管复杂性很明显,只要理解了基本思想,就很容易使用GridBagLayout了
GridBagLayout类是一个灵活的布局管理器,它不要求组件的大小相同即可将组件垂直和水平对齐。每个GridBagLayout对象维持一个动态的矩形单元网格,每个组件占用一个或多个这样的单元,称为显示区域。
每个由GridBagLayout管理的组件都与 GridBagConstraints 的实例相关联。Constraints 对象指定组件在网格中的显示区域以及组件在其显示区域中的放置方式。除了 Constraints 对象之外,GridBagLayout 还考虑每个组件的最小和首选大小,以确定组件的大小。
网格的总体方向取决于容器的 ComponentOrientation 属性。对于水平的从左到右的方向,网格坐标 (0,0) 位于容器的左上角,其中 X 向右递增,Y 向下递增。对于水平的从右到左的方向,网格坐标 (0,0) 位于容器的右上角,其中 X 向左递增,Y 向下递增。
为了有效使用网格包布局,必须自定义与组件相关联的一个或多个 GridBagConstraints 对象。可以通过设置一个或多个实例变量来自定义 GridBagConstraints 对象
(一)GridBagLayout的构造方法
GridBagLayout()创建网格包布局管理器
(二)GridBagLayout的使用
【例8.10】GirdBagLayout的创建,程序名为GBLTest.java,代码如下所示
package bedeck;
import java.awt.*;
import java.applet.*;
public class GBLTest extends Applet{
GridBagLayout gbl=new GridBagLayout();
GridBagConstraints gbc=new GridBagConstraints();
Button b1 = new Button("按扭一");
Button b2 = new Button("按扭二");
Button b3 = new Button("按钮三");
public void init(){
this.setLayout(gbl); //设置布局方式为网格包布局
/*
* 放置一个按钮b1到单元(10,3)中
* 建立约束
*/
gbc.gridx = 10;
gbc.gridy = 3;
gbl.setConstraints(b1, gbc);
/*
* 放置一个按钮b2到单元(7,8)中
* 建立约束
*/
gbc.gridx = 7;
gbc.gridy = 8;
gbl.setConstraints(b2, gbc);
/*
* 放置一个按钮b2到单元(10,18)中
* 建立约束
*/
gbc.gridx = 10;
gbc.gridy = 18;
this.add(b1);
this.add(b2);
this.add(b3);
}
}
|
说明: 由于GridBagLayout管理的组件都与 GridBagConstraints 的实例相关联,所以使用时自定义与组件相关联的一个或多个 GridBagConstraints 对象。
GridBagConstraints 类指定使用 GridBagLayout 类布置的组件的约束。
程序中gridx是指定包含组件的显示区域开始边的单元格,其中行的第一个单元格为gridx=0;gridy是指定位于组件显示区域的顶部的单元格,其中最上边的单元格为gridy=0。
运行结果如8-12所示
8-12 网格包布局
【注意】GridBagLayout管理器中布局的内容,不管窗口好大还是好少,他的组件不会随之改变
8.3.6手工布局
因为布局管理器负责容器里的组件的位置和大小,因此不需要总是自己去设定组件的大小或位置。如果想这样做(使用setLocation(),setSize()或setBounds()方法中的任何一种),布局管理器将覆盖你的决定
如果必须控制组件的大小或位置,而使用标准布局管理器做不到,那就可能通过将下述方法调用发送到容器中来中止布局管理器,具体的方法是将setLayout(LayoutManger mgr)里的参数设为null,如setLayout(null);
做完了上一步,必须对所有的组件使用setLocation(),setSize()或setBounds(),来将它们定位在容器中
【例8.11】利用手工布局添加几个组件到指定的位置,程序名为HdTest.java,程序代码如下
package bedeck;
import java.awt.*;
import java.applet.*;
public class HdTest extends Applet{
Choice choice = new Choice(); // 构造一个选择菜单
/*
* 构造三个按钮
* */
Button b1 = new Button("按扭一");
Button b2 = new Button("按扭二");
Button b3 = new Button("按钮三");
public void init(){
this.setLayout(null); //如果要用手工布局,此设置为必要的步骤
/*
* 向选择菜单添加内容
* */
choice.addItem("选项一");
choice.addItem("选项二");
choice.addItem("选项三");
choice.setBounds(80, 80, 100, 20); //设置位置
this.add(choice); //向applet容器中添加选择菜单
b1.setBounds(10, 20, 50, 30);
b2.setBounds(20, 50, 50, 20);
b3.setBounds(180, 100, 50, 50);
this.add(b1);
this.add(b2);
this.add(b3);
}
}
|
说明:Choice 类表示一个弹出式选择菜单。当前的选择显示为菜单的标题。构造方法只有一个:Choice(),创建一个新的选择菜单。常用的方法有:
③ Public void add(String item)将一个项添加到此 Choice 菜单中
④ Public void addItem(String item)如果对于 Java 2 platform v1.1 已过时,请使用 add 方法替换
⑤ Public String getItem(int index)获得此 Choice 菜单中指定索引上的字符串
⑥ Public void insert(String item, int index)将菜单项插入此选择的指定位置上
⑦ Public void remove(int position)从选择菜单的指定位置上移除一个项
运行结果如8-13所示
8-13 手工布局
【注意】由于窗口系统和字体大小之间的不同,这种办法将导致从属于平台的布局。更好的途径是创建布局管理器的新子类
8.4 面板
Pan
el 是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板,也就是说容器里面还有容器,使用面板的目的是为了分层次,分区域管理各种组件。
面板的默认布局管理器是 FlowLayout 布局管理器
8.4.1panel的构造方法
① Panel()使用默认的布局管理器创建新面板。
② Panel(LayoutManager layout)创建具有指定布局管理器的新面板。
8.4.2面板控制
【例8.12】用面板控制组件的布局,程序名为PanelTest.java,代码如下所示
package bedeck;
import java.awt.*;
import java.applet.*;
public class PanelTest extends Applet{
BorderLayout bl = new BorderLayout();
Panel pl = new Panel();
Panel p2 = new Panel();
public void init(){
this.setLayout(bl);
this.setForeground(Color.black); //设置applet窗口的前景色为黑色
this.add("North",new Label("在applet中",Label.CENTER)); //向applet小程序的北方添加一个标签,标签的对齐方式为居中
this.add("West",pl); //向applet默认窗口中添加一个panel容器
pl.setBackground(Color.blue); //设置panel容器的背景色
pl.setForeground(Color.CYAN);
pl.setLayout(new BorderLayout()); //设置容器布局方式为BorderLayout
pl.add("East",new Button("东"));
pl.add(new Button("西"),BorderLayout.WEST);
pl.add(new Label("在pl中"),BorderLayout.CENTER);
this.add("East",p2);
p2.setBackground(Color.green);
p2.setLayout(new BorderLayout());
p2.add("North",new TextField("文本框",10));
p2.add(new Label("在p2中"),BorderLayout.SOUTH);
}
}
|
说明:由于面板的颜色和applet窗口的颜相同,为了使读者能够看到panel效果,所以在程序中对容器的颜色进行了设置。
运行结果如8-13所示
8-13 面板
【注意】程序中pl.setLayout(new BorderLayout())不能写成p1.setLayout(bl),其它的雷同
8.5 小结
本章主要是让用户认识java图形用户介面和实现java的图形用户介面方法。对java.awt包中常用的组件,如标签,按钮,文本框,列表框,文本域,单选按扭,复选框,列表框,面板中的功能,构造方法,常用方法进行撑握,灵活的运用,熟悉java.awt中常用的布局管理器,知道在什么情况下用什么样的布局管理器以及名布局方式的特点。
对java.awt包和javax.swing包的进行区别和联系,通过对本章的学习推出swing中的用法,和swing中组件的名命方式
8.6习题
编写一个applet,包括一个文本域和三个按钮。按下每个按钮的时候,在文本域中显示不同的文字。(未完)