第7章 Java GUI图形用户界面应用程序设计Word下载.docx
《第7章 Java GUI图形用户界面应用程序设计Word下载.docx》由会员分享,可在线阅读,更多相关《第7章 Java GUI图形用户界面应用程序设计Word下载.docx(126页珍藏版)》请在冰豆网上搜索。
(1)组件—图形用户界面的各种元素称为组件Component,它是一个图形化方式显示在屏幕上与用户交户的对象,组件分容器类(Container)和非容器类组件,容器类组件可包含其它组件,也可以是其它容器。
非容器类组件不包含其它组件,提供人机交互如按钮类Button﹑标签类Label﹑TextComponent-文本类.
(2)容器—用来组织其它界面元素的单元,如窗口包含许多界面成分和元素,这些界面元素本身又可以是容器,这个容器再进一步包含它的界面成分和元素依此类推,形成复杂图形用户界面。
容器类分顶层容器和非顶层容器两类:
顶层容器可以是独立窗口,顶层容器类是Window其常用的子类为Frame-窗口(框架)类﹑Dialog-对话框类,这两个类带有边框﹑可移动﹑放大﹑缩小和关闭功能.非顶层容器必须位于某个顶层容器窗口之内,不能独立存在。
面板类属非顶层容器类如:
Scollpane滚动面板子类,Applet面板子类,都是无边框的容器类.容器特点:
1.容器有一定范围:
一般为矩形边界有边框,有些无可见标记。
2.容器有一定位置:
位置可是屏幕四角的绝对位置,也可是相对其它容器的相对位置
3.容器有一个背景:
背景覆盖全部容器,可透明,也可以指定一幅图案,使界面生动活泼。
4.容器包含许多界面成分和元素:
容器打开显示时,其上面的所有成分和元素被显示出来,关闭时被隐藏。
5.容器可按一定的物理规则排列它元素的相对位置和前后排列关系。
容器是Component组件的子类,具有组件的所有性质,因此也是组件。
Component类中定义了各种GUI组件对象所需的属性和方法。
容器类对象可使用父类Component中的add()方法添加组件。
Java中GUI容器类层次关系图:
容器包含两个抽象类:
Window类和Panel类,Window类可自由停泊在顶层窗口,Panel类为可容纳其它组件的非顶层容器,它不能独立存在,必须被添加到其它容器中,如Window或Applet容器,向容器中添加组件用add()方法,删除容器中的组件用removeAll()方法或remove(Componentc)方法,为保正在容器中正常显示组件,应调用validate()方法.
Java组件在容器中的位置和尺寸由布局管理器决定,人工控制组件在容器中的位置和尺寸,可取消布局管理器,使用如下方法:
publicsetLocation(intx,inty)–设置(移动)当前组件到一个新位置坐标点。
publicsetSize(intwidth,intheight)–设置组件大小。
publicsetBounds(intx,inty,intwidth,intheight)–设置窗口在屏幕显示位置为距屏幕左面x像素,距上方y像素,宽度和高度。
抽象Window类不能实例化,因此在子类Frame-框架类中实现
1.Frame类的特点
(1)Frame类是抽象类Window的子类。
(2)Frame对象显示一个带标题和尺寸重置角标的窗口。
(3)默认为不可见。
设置setVisible(ture)为可视。
(4)默认布局管理器是BorderLayout(边界布局管理器),可使用setLayout()方法改变其默认布局管理器,Frame类的层次关系如图:
java.lang.Object
├─java.awt.Component
├─java.awt.Container
├─java.awt.Window
└─java.awt.Frame
例7-1TestFrame.java–框架窗口应用
importjava.awt.*;
publicclassTestFrame{
publicstaticvoidmain(Stringargs[]){
//创建标题为MyFrameTest的框架窗口容器对象实例
Framef=newFrame("
MyFrameTest"
);
f.setSize(170,100);
//设置Frame组件窗口大小(宽﹑高)
f.setBackground(Color.blue);
//设置Frame组件背景色为蓝色
f.setVisible(true);
//设置Frame组件为可视
}
}
编译为.class文件用JCreator执行
2.Panel面板类的特点
(1)Panel类是非顶层容器它不能独立存在,必须被添加到其它容器中,如Window或Applet
(2)Panel类可容纳其它组件,在程序中用于布局和定位。
(3)可用所在容器的不同布局管理器布局。
(4)默认布局管理器为FlowLayout(流布局管理器),可使用setLayout()方法改变其默认布局管理器。
Panel类的层次关系如图:
└─java.awt.Panel
例7-2TestFrameWithPanel.java–面板类的应用(面板类的默认布局管理器为FlowLayout布局)
publicclassTestFrameWithPanel{
publicstaticvoidmain(Stringargs[]){
MyFrameWithPanelTest"
//创建带标题的窗口容器组件对象实例
Panelpan=newPanel();
//在窗口容器上创建面板容器对象
f.setSize(180,100);
//设置Frame组件窗口大小(宽﹑高)
f.setBackground(Color.blue);
f.setLayout(null);
//取消布局管理器(可同时看到窗口和面板组件)
pan.setSize(100,60);
//设置面板容器大小(宽﹑高)
pan.setBackground(Color.green);
//设置面板容器组件背景色为绿色
f.add(pan);
//在窗口容器组件中添加面板容器对象
f.setVisible(true);
2-1.ScrollPane类
是Container类的子类,因此也是一个容器称为滚动面板,经常将组件放到面板中,然后再添加到滚动面板中显示。
ScrollPane有2个构造方法:
(1)ScrollPane()-创建滚动面板,滚动条初始不可见,当组件范围大于滚动面板时,滚动条自动产生。
(2)ScrollPane(inta)-参数a指定滚动条的初始状态,有3个值。
ScrollPane.SCROLLBARS_ALWAYS-总是带滚动条
ScrollPane.SCROLLBARS_AS_NEEDED–滚动条作为需要的
ScrollPane.SCROLLBARS_NEVER-不需要滚动条
【例7.11】-Example7_11.java流布局
importjava.awt.event.*;
classWindoTenextendsFrameimplementsActionListener{
Panelp;
//声明面板容器对象
ScrollPanescrollpane;
//声明滚动条面板容器对象
WindoTen(){//窗口构造函数
setLayout(newFlowLayout());
//设为流布局
p=newPanel();
//创建面板容器对象
scrollpane=newScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
//创建滚动条面板容器对象
p.add(newButton("
one"
));
//添加4个按钮到面板容器对象中
two"
three"
four"
scrollpane.add(p);
//将面板容器对象添加到滚动条面板容器对象中
add(scrollpane);
//将滚动条面板容器添加到窗口容器中
setBounds(60,60,200,200);
//设置窗口在屏幕显示位置为距屏幕左面60像素,距上方60像素,宽高各为200
setVisible(true);
//设置窗口可见
validate();
//添加组件时调用validate()生效方法,保证组件在容器中正确显示
publicvoidactionPerformed(ActionEvente){System.exit(0);
publicclassExample7_11{
publicstaticvoidmain(Stringargs[]){
newWindoTen();
//创建窗口对象并调用构造函数
7.1.2布局管理器
为生成具有良好与平台无关性的图形用户界面,Java中提供了布局管理器工具(ContainerLayouts)来管理组件在容器中的布局,而不手动设置组件位置和大小。
每个容器都有一个布局管理器,当容器需对组件定位或判断大小尺寸时,就会调用其对应的布局管理器。
Java语言目前提供有FlowLayout,BorderLayout,GridLayout,BoxLayout,CardLayout,GridBagLayout等布局管理器。
(1)FlowLayout(流布局管理器)
FlowLayout流布局管理器是Panel类的默认容器布局管理器。
FlowLayout布局对组件逐行定位,行内从左到右,一行排满后换行,默认对齐为居中对齐。
不改变组件的大小,按组件原有尺寸显示组件,可在构造方法中设置不同的组件间距,行距及对齐方式。
FlowLayout的构造方法
newFlowLayout(FlowLayout.RIGHT,20,40);
//右对齐,组件之间水平间距20个像素,竖直间距40个像素。
newFlowLayout(FlowLayout.LEFT);
//左对齐,水平间距和竖直间距为默认5个像素。
newFlowLayout();
//居中对齐,水平间距和竖直间距为默认5个像素。
例7-3TestFlowLayout.java-流布局应用
publicclassTestFlowLayout{
FlowLayout"
//创建带标题的窗口容器组件对象实例
Buttonbutton1=newButton("
Ok"
//创建3个按钮组件对象
Buttonbutton2=newButton("
Open"
Buttonbutton3=newButton("
Close"
//窗口设置为流布局管理器:
居中对齐,水平间距和竖直间距为默认5个像素(),注意:
Frame默认是BorderLayout(边界布局管理器).
f.setLayout(newFlowLayout());
//创建居中对齐的流布局对象并将窗口设置为流布局
f.add(button1);
//将3个按钮添加到容器f中
f.add(button2);
f.add(button3);
f.setSize(100,100);
//设置窗口(框架)容器大小
//设置窗口容器为可视
(2)BorderLayout(边界布局管理器)
BorderLayout(边界布局管理器)将整个容器的布局划分成东﹑南﹑西﹑北﹑中五个区域,组件只能被添加到指定的区域﹑每个区域只能加入一个组件,后加入的组件会代替前组件,不指定组件区域默认放在Center区域。
BorderLayout边界布局容器尺寸缩放原则:
南﹑北区域在水平方向缩放
东﹑西区域在垂直方向缩放
中部区域在两个平方向缩放
布局为:
例7-4TestBorderLayout.java-边界布局管理器应用-Frame默认是BorderLayout(边界布局管理器).
publicclassTestBorderLayout{
Framef;
f=newFrame("
BorderLayout"
//创建Frame窗口容器
Buttonbn=newButton("
BN"
//创建5个对应按钮
Buttonbs=newButton("
BS"
Buttonbw=newButton("
BW"
Buttonbe=newButton("
BE"
Buttonbc=newButton("
BC"
f.add(bn,"
North"
//添加五个组件按钮添加到窗口容器f中的边界布局东﹑南﹑西﹑北﹑中
f.add(bs,"
South"
f.add(bw,"
West"
f.add(be,"
East"
f.add(bc,"
Center"
f.setSize(200,200);
//设置窗口容器尺寸
f.setVisible(true);
//设置窗口容器可视
(3)GridLayout(网(栅)格布局管理器)
GridLayout(网(栅)格布局管理器)将布局划分为矩形网格,每个单元格区域大小相等。
组件被添加到每个单元格中,先从左到右添满换行,再从上到下:
在GridLayout()构造方法中指定分隔的行列数,如:
NewGridLayout(3,4);
//创建3行4例的网格布局
例7-5TestGridLayout.java-网格布局管理器应用
publicclassTestGridLayout{
GridLayoutExample"
Buttonb1=newButton("
b1"
//创建6个按钮
Buttonb2=newButton("
b2"
Buttonb3=newButton("
b3"
Buttonb4=newButton("
b4"
Buttonb5=newButton("
b5"
Buttonb6=newButton("
b6"
f.setLayout(newGridLayout(3,2));
//设置窗口容器布局为3行2例的网格布局
f.add(b1);
f.add(b2);
//将6个按钮添加到窗口3行2例网格布局中去
f.add(b3);
f.add(b4);
f.add(b5);
f.add(b6);
f.pack();
//设置窗口容器为紧凑格式
f.setVisible(true);
//设置窗口容器可视
【例7.15】Example7_15.java-网格布局
classWinGridextendsFrame
{GridLayoutgrid;
//声明网格布局对象
WinGrid()//构造方法
{grid=newGridLayout(12,12);
//创建12行列网格布局对象
setLayout(grid);
//设置布局为网格布局
Labellabel[][]=newLabel[12][12];
//创建一个标签类的12行列的二维数组label
for(inti=0;
i<
12;
i++)//外层循环输出行i
{for(intj=0;
j<
j++)//内层循环输出行列j
{label[i][j]=newLabel();
//创建标签对象存入二维数组
if((i+j)%2==0)//如果行列下标之和能被2整除
label[i][j].setBackground(Color.black);
//设置标签对象颜色为黑色
else//否则
label[i][j].setBackground(Color.white);
//设置标签对象颜色为白色
add(label[i][j]);
//添加标签对象到窗口容器中
//设置窗口在屏幕显示位置为距屏幕左面10像素,距上方10像素,宽高各为260
setBounds(10,10,260,260);
setVisible(true);
//设置窗口及标签对象可视
validate();
publicclassExample7_15
{publicstaticvoidmain(Stringargs[])
{newWinGrid();
(4)BoxLayout–盒式布局管理器
BoxLayout在java.swing.border包中,也是Container类中的一个子类,因此为盒式容器。
构造方法:
BoxLayout(Containercon,intaxis)
con-容器对象
axis的值有:
(1)BoxLayout.X_AXIS–行型布局
(2)BoxLayout.Y_AXIS–列型布局。
组件加入的顺序是从左(上)到右(下)排列,容器的两端为剩余空间。
与FlowLayout流布局局不同的是,它仅有一行(列),无论组件多少只排列在该行(列)中,因此组件可能被压缩变形。
【例7.16】Example7_16.java布局
importjavax.swing.*;
//引入swing.*
importjavax.swing.border.*;
publicclassExample7_16
{newWindowBox();
//创建窗口对象并调用构造方法
classWindowBoxextendsFrame//声明WindowBox子类继承Frame类
{BoxbaseBox,boxV1,boxV2;
//声明行型盒式布局容器对象baseBox,列型盒式布局容器对象boxV1,boxV2引用变量
WindowBox()//构造方法
{boxV1=Box.createVerticalBox();
//使用Box类的静态方法获得一个列型盒式布局容器对象boxV1
boxV1.add(newLabel("
姓名"
//在容器中添加姓名标签组件
boxV1.add(Box.createVerticalStrut(8));
//在容器中添加垂直支撑高度为8(控制组件间的垂直距离),宽度为0
email"
//在容器中添加email标签组件
//在容器中添加垂直支撑高度为8,宽度为0
职业"
//在容器中添加职业标签组件
boxV2=