Java GUI可视化编程.docx
《Java GUI可视化编程.docx》由会员分享,可在线阅读,更多相关《Java GUI可视化编程.docx(24页珍藏版)》请在冰点文库上搜索。
JavaGUI可视化编程
模块十建立GUIs
模块十建立GUIs1
1.抽象窗口工具包(AWT)2
2.第三节建立图形用户界面3
2.1.容器3
2.2.定位组件3
2.3.组件大小3
3.框架(Frames)3
4.Panels4
5.容器布局(ContainerLayout)5
5.1.布局管理器5
5.2.FlowLayout的一个简单例子6
6.布局管理器7
6.1.FlowLayout7
6.2.BorderLayout9
6.3.GridLayout10
6.4.CardLayout12
6.5.GridBag14
7.创建面板及复杂布局14
8.练习:
建立JavaGUIs15
8.1.创建计算器GUI15
8.2.创建帐目GUI16
8.3.检查进步情况16
本模块为你介绍:
使用AWT(抽象视窗工具包----建立GUIs的类包)建立图形用户界面及其布局。
完成本模块学习时,你应该能够:
-描述AWT包及其组件
-描述Container、Component及LayoutManager等术语,以及它们如何在一起建立GUI
-使用LayoutManager
-使用Flow、Border、Gird及Card布局管理器来获得期望的动态布局
-增加组件到Container
-正确运用Frame及Panel容器
-描述如何使用嵌套容器来完成复杂的布局
-在Java软件程序中,标识如下内容:
-容器
-相关布局管理器
-所有组件的布局层次
1.抽象窗口工具包(AWT)
AWT提供Java小应用程序(applets)及应用程序中使用的基本GUI组件。
AWT为应用提供独立于机器的接口,这将保证基于AWT的软件具有跨平台可移植的能力。
在学AWT之前,简单回顾一下对象层次结构:
超类是可以扩展的,它们的属性是可继承的。
而且,类可以是抽象的,也就是说,它们是子类的模板,子类可以具体实现它们。
java.awt包中包含了生成GUI组件的类。
该包的基本情况如下图所示。
显示在屏幕上的每个GUI组件都是抽象类Component或MenuComponent的子类。
也就是说,每个基本的组件都从Component类中继承了方法和实例变量。
同样,菜单组件继承了MenuComponent类的方法和实例变量。
Container(容器)是Component的一个抽象子类,它允许其它的组件嵌套在里面。
这些组件也可以是允许其它组件嵌套在里面的容器,于是就创建了一个完整的层次结构。
在屏幕上布置GUI组件,容器是很有用的。
Panel是Container的最简单的子类。
Container的另一个子类是Window。
2.建立图形用户界面
2.1.容器
GUI组件需要使用add方法加入到容器中。
容器有两个主要类型:
Window和Panel
Window是显示屏上独立的本机窗口,它独立于其它容器。
Window有两种形式:
Frame(框架)和Dialog(对话框)。
Frame是一个带有标题和缩放角的窗口。
对话框没有菜单条。
尽管它能移动,但它不能缩放。
Panel包含在另一个容器中,或是在Web浏览器的窗口中。
Panel确定一个四边形,其它组件可以放入其中。
Panel必须放在Window之中(或Window的子类中)以便能显示出来。
2.2.定位组件
容器里的组件的位置和大小是由布局管理器决定的。
容器保持布局管理器的一个特定实例的引用。
当容器需要定位一个组件时,它将调用布局管理器来做。
当决定一个组件的大小时,同样如此。
布局管理器完全控制容器内的所有组件。
它负责计算并定义上下文中对象在实际屏幕中所需的大小。
2.3.组件大小
因为布局管理器负责管理容器里的组件的位置和大小,因此,通常不需要自己去设定组件的大小或位置。
如果想这样做(使用setLocation(),setSize()或setBounds()方法中的任何一种),布局管理器将覆盖你的决定。
如果使用标准布局管理器不能满足你的需要,必须自己控制组件的大小或位置时,你可以通过下述方法来中止布局管理器:
MyContainer.setLayout(null);
做完这一步,必须对所有的组件使用setLocation(),setSize()或setBounds(),来将它们定位在容器中。
请注意,由于窗口系统和字体大小之间的不同,这种办法将导致从属于平台的布局。
更好的途径是创建布局管理器的新子类。
3.框架(Frames)
Frame是Window的一个子类。
它是带有标题和缩放角的窗口。
它继承于Java.awt.Container,因此,可以用add()方式来给框架添加组件。
框架的缺省布局管理器就是BorderLayout。
可以用setLayout()方式来改变布局管理器。
Frame类中的构造函数Frame(String)用由String规定的标题来创建一个新的不可见的框架对象。
当它还处于不可见状态时,将所有组件添加到框架中。
例如:
importjava.awt.*;
publicclassMyFrameextendsFrame{
publicstaticvoidmain(Stringargs[]){
MyFramefr=newMyFrame("HelloOutThere!
");
fr.setSize(500,500);
fr.setBackground(Color.blue);
fr.setVisible(true);
}
publicMyFrame(Stringstr){
super(str);
}
}
上述程序创建了下述框架,它有一个具体的标题、大小及背景颜色。
注:
在框架显示在屏幕上之前,必须做成可见的(通过调用程序setVisible(true)),而且其大小是确定的(通过调用程序setSize()或pack())。
4.Panels
象Frames一样,Panels提供空间来捆绑GUI组件,包括其它面板。
每个面板都可以有它自己的布管理程序。
一旦一个面板对象被创建,为了能看得见,它必须添加到窗口或框架对象上。
用Container类中的add()方式可以做到这一点。
下面的程序创建了一个小的黄色面板,并将它加到一个框架对象上:
importjava.awt.*;
publicclassFrameWithPanelextendsFrame{
//Constructor
publicFrameWithPanel(Stringstr){
super(str);
}
publicstaticvoidmain(Stringargs[]){
FrameWithPanelfr=newFrameWithPanel("FramewithPanel");
Panelpan=newPanel();
fr.setSize(200,200);
fr.setBackground(Color.blue);
fr.setLayout(null);//overridedefaultlayoutmgr
pan.setSize(100,100);
pan.setBackground(Color.yellow);
fr.add(pan);
fr.setVisible(true);
}
}
5.容器布局(ContainerLayout)
容器中组件的布局通常由布局管理器控制。
每个Container(比如一个Panel或一个Frame)都有一个与它相关的缺省布局管理器,它可以通过调用setLayout()来改变。
布局管理器负责决定布局策略以及其容器的每一个子组件的大小。
5.1.布局管理器
Java编程语言包含下面的布局管理器:
-FlowLayout—Panel和Applets的缺省布局管理器
-BorderLayout—Window、Dialog及Frame的缺省管理程序
-GridLayout
-CardLayout
-GridBagLayout
GridBag布局管理器在本模块中不深入讨论。
下图阐述了容器的默认布局管理器
5.2.FlowLayout的一个简单例子
这个样板代码阐述了几个要点,将在下一节讨论。
1.importjava.awt.*;
2.
3.publicclassExGui{
4.privateFramef;
5.privateButtonb1;
6.privateButtonb2;
7.
8.publicstaticvoidmain(Stringargs[]){
9.ExGuiguiWindow=newExGui();
10.guiWindow.go();
11.}
12.
13.publicvoidgo(){
14.f=newFrame("GUIexample");
15.f.setLayout(newFlowLayout());
16.b1=newButton("PressMe");
17.b2=newButton("Don'tPressMe");
18.f.add(b1);
19.f.add(b2);
20.f.pack();
21.f.setVisible(true);
22.}
23.}
这段代码会生成如下界面:
图10-5
5.2.1.main()方法
本例中第8行main()方法有两个作用。
首先,它创建了ExGui对象的一个实例。
回想一下,直到一个实例存在,还没有被称做f,b1和b2的真实数据项可以使用。
第二,当数据空间被创建时,main()在该实例的上下文中调用实例方法go()。
在go()中,真正的运行才开始。
5.2.2.newFrame(“GUIExample”)
这个方法创建Java.awt.Frame类的一个实例。
根据本地协议,在Java编程语言中,Frame是顶级窗口,带有标题条,在这种情况下,标题条由构造函数的参数“GUIExample”定义,此时Frame是不可见的,大小为零。
5.2.3.f.setLayout(newFlowLayout())
这个方法创建Flow布局管理器的一个实例,并将它安装在框架中。
Frame默认的布局管理器是BorderLayout,但本例中没有使用。
Flow布局管理器在AWT中是最简单的,它在某种程度上象一个页面中的单词被安排成一行一行的那样来定位组件。
请注意,Flow布局缺省地将每一行居中。
5.2.4.newButton(“PressMe”)
这个方法创建Java.awt.Button类的一个实例。
按钮是从本地窗口工具包中取出的一个标准按钮。
按钮标签由构造函数的参数字符串定义。
5.2.5.f.add(b1)
这个方法告诉框架f,它将包容组件b1。
b1的大小和位置受从这一点向前的Frame布局管理器的控制。
5.2.6.f.pack()
这个方法告诉框架来设定大小,能恰好密封它所包含的组件。
5.2.7.f.setVisible(true)
这个方法使框架以及其所有的内容变成用户看得见的东西。
6.布局管理器
6.1.FlowLayout
前面所用的FlowLayout布局管理器对组件逐行地定位。
每完成一行,一个新行便又开始。
与其它布局管理器不一样,FlowLayout布局管理器不限制它所管理的组件的大小,而是允许它们有自己的最佳大小。
Flow布局构造程序参数允许将组件左对齐或右对齐(缺省为居中)。
如果想在组件之间创建一个更大的最小间隔,可以规定一个界限。
当用户对由Flow布局管理的区域进行缩放时,布局就发生变化。
如:
下面的例子就是如何用类容器的setLayout()方法来创建Flow布局对象并安装它们。
setLayout(newFlowLayout(intalign,inthgap,intvgap));
align的值必须是FlowLayout.LEFT,FlowLayout.RIGHT,或FlowLayout.CENTER。
例如:
setLayout(newFlowLayout(FlowLayout.RIGHT,20,40));
下述程序构造并安装一个新Flow布局,它带有规定好的对齐方式以及一个缺省的5单位的水平和垂直间隙。
setLayout(newFlowLayout(FlowLayout.LEFT));
下述程序构造并安装一个新Flow布局,它带有规定好的居中对齐方式和一个缺省的5单位的水平和垂直间隙。
setLayout(newFlowLayout());
下面的代码将几个按钮添加到框架中的一个Flow布局中:
importjava.awt.*;
publicclassMyFlow{
privateFramef;
privateButtonbutton1,button2,button3;
publicstaticvoidmain(Stringargs[]){
MyFlowmflow=newMyFlow();
mflow.go();
}
publicvoidgo(){
f=newFrame("FlowLayout");
f.setLayout(newFlowLayout());
button1=newButton("Ok");
button2=newButton("Open");
button3=newButton("Close");
f.add(button1);
f.add(button2);
f.add(button3);
f.setSize(100,100);
f.setVisible(true);
}
}
6.2.BorderLayout
BorderLayout布局管理器为在一个Panel或Window中放置组件提供一个更复杂的方案。
BorderLayout布局管理器包括五个明显的区域:
东、南、西、北、中。
北占据面板的上方,东占据面板的右侧,等等。
中间区域是在东、南、西、北都填满后剩下的区域。
当窗口垂直延伸时,东、西、中区域也延伸;而当窗口水平延伸时,东、西、中区域也延伸。
BorderLayout布局管理器是用于Dialog和Frame的缺省布局管理器。
下面这一行构造并安装一个新Border布局管理器,在组件之间没有间隙:
setLayout(newBorderLayout());
这一行构造并安装一个Border布局,在组件之间有由hgap和vgap规定的间隙:
setLayout(newBorderLayout(inthgap,intvgap);
在布局管理器中组件必须被添加到指定的区域,而且还看不见。
区域名称拼写要正确。
可以使用Border布局管理器来产生布局,且带有在缩放时在一个方向、另一方向或双方向上都延伸的元素。
如果离开一个Border布局未使用的区域,,好象它的大小为0。
中央区域即使在不含组件的情况下仍然呈现为背景。
可以仅将单个组件添加到Border布局管理器五个区域的每一个当中。
如果添加不止一个,只有最后一个看得见。
后面的模块将演示如何用中间容器来允许不止一个组件被放在单个Border布局管理器区域的空间里。
下面的代码对前例进行了修改,表示出了Border布局管理器的特性。
可以用从Container类继承的setLayout()方法来将布局设定为Border布局。
1.importjava.awt.*;
2.
3.publicclassExGui2{
4.privateFramef;
5.privateButtonbn,bs,bw,be,bc;
6.
7.publicstaticvoidmain(Stringargs[]){
8.ExGui2guiWindow2=newExGui2();
9.guiWindow2.go();
10.}
11.
12.publicvoidgo(){
13.f=newFrame("BorderLayout");
14.bn=newButton("B1");
15.bs=newButton("B2");
16.be=newButton("B3");
17.bw=newButton("B4");
18.bc=newButton("B5");
19.
20.f.add(bn,BorderLayout.NORTH);
21.f.add(bs,BorderLayout.SOUTH);
22.f.add(be,BorderLayout.EAST);
23.f.add(bw,BorderLayout.WEST);
24.f.add(bc,BorderLayout.CENTER);
25.
26.f.setSize(200,200);
27.f.setVisible(true);
28.}
29.}
这段代码产生如下界面:
6.3.
GridLayout
GridLayout布局管理器为放置组件提供了灵活性。
用许多行和列来创建管理器。
然后组件就填充到由管理器规定的单元中。
比如,由语句newGridLayout(3,2)创建的有三行两列的GridLayout布局能产生如下六个单元:
图10-8
象BorderLayout布局管理器一样,GridLayout布局管理器中的组件相应的位置不随区域的缩放而改变。
只是组件的大小改变。
GridLayout布局管理器总是忽略组件的最佳大小。
所有单元的宽度是相同的,是根据单元数对可用宽度进行平分而定的。
同样地,所有单元的高度是相同的,是根据行数对可用高度进行平分而定的。
将组件添加到网格中的命令决定它们占有的单元。
单元的行数是从左到右填充,就象文本一样,而列是从上到下由行填充。
程序行:
setLayout(newGridLayout());创建并安装一个Grid布局,仅有一行一列。
程序行:
setLayout(newGridLayout(introws,intcols));创建并安装一个带有规定好行数和栏数的Grid布局。
程序行:
setLayout(newGridLayout(introws,intcols,inthgap,intvgap);创建并安装一个带有规定好行数和栏数的网格布局。
hgap和vgap规定组件间各自的间隙。
水平间隙放在左右两边及栏与栏之间。
垂直间隙放在顶部、底部及每行之间。
图10-8系由如下代码生成:
1.importjava.awt.*;
2.publicclassGridEx{
3.privateFramef;
4.privateButtonb1,b2,b3,b4,b5,b6;
5.
6.publicstaticvoidmain(Stringargs[]){
7.GridExgrid=newGridEx();
8.grid.go();
9.}
10.
11.publicvoidgo(){
12.f=newFrame("Gridexample");
13.
14.f.setLayout(newGridLayout(3,2));
15.b1=newButton("1");
16.b2=newButton("2");
17.b3=newButton("3");
18.b4=newButton("4");
19.b5=newButton("5");
20.b6=newButton("6");
21.
22.f.add(b1);
23.f.add(b2);
24.f.add(b3);
25.f.add(b4);
26.f.add(b5);
27.f.add(b6);
28.
29.f.pack();
30.f.setVisible(true);
31.}
32.}
6.4.CardLayout
Card布局管理器能将界面看作一系列的卡,在任何时候都仅能看到其中的一个。
用add()方法来将卡添加到Card布局中。
Card布局管理器的show()方法将请求转换到一个新卡中。
下例就是一个带有5张卡的框架。
鼠标点击左面板将视图转换到右面板,等等。
用来创建上图框架的代码段如下所示:
1.importjava.awt.*;
2.importjava.awt.event.*;
3.
4.publicclassCardExampleimplementsMouseListener{
5.Panelp1,p2,p3,p4,p5;
6.Labell1,l2,l3,l4,l5;
7.
8.//DeclareaCardLayoutobjecttocallitsmethods
9.privateCardLayoutmyCard;
10.privateFramef;
11.
12.publicCardExample(){
13.f=newFrame("CardTest");
14.myCard=newCardLayout();
15.
16.//createthepanelsthatIwant//touseascards
17.p1=newPanel();
18.p2=newPanel();
19.p3=newPanel();
20.p4=newPanel();
21.p5=newPanel();
22.
23.//createalabeltoattachtoeachpanel
24.l1=newLabel("ThisisthefirstPanel");
25.l2=newLabel("ThisisthesecondPanel");
26.l3=newLabel("ThisisthethirdPanel");
27.l4=newLabel("ThisisthefourthPanel");
28.l5=newLabel("ThisisthefifthPanel");
29.}
30.
31.