Java图形界面编程第四章24.1本章任务•掌握Java图形界面设计的基本原理;•理解java.awt和javax.swing软件包的类层次结构;•掌握利用Java的GUI组件来创建按钮、标签、列表、面板等组件;•掌握Java图形界面的事件模型;•掌握利用Java布局管理器来对Java图形界面进行布局管理。34.2基础知识4基本的AWT组件•图形用户界面(GUI)可以通过键盘或鼠标来响应用户的操作。•抽象窗口工具包(AWT)是一组Java类,此组Java类允许创建图形用户界面(GUI)。•AWT提供用于创建生动而高效的GUI的各种组件。5java.awt包中的类体系结构ComponentButtonCheckboxContainerChoiceCanvasTextComponentLabelPanelWindowAppletFrameDialogTextAreaTextField6容器•可以存放组件的区域,可在容器上进行绘制和着色•java.awt包中的Container类可直接或间接派生出两个常用容器:框架(Frame类)和面板(Panel类)。•框架是一个带有边框的独立的窗口。•面板是包含在窗口中的一个不带边框的区域。7容器–框架•框架是独立于Applet和浏览器的一个窗口。•可以通过以下任一构造函数来创建:–Frame():创建一个不含标题的标准窗口–Frame(StringTitle):创建一个含有标题的窗口,这个标题是由参数title指定的。•当一个Frame窗口被创建以后,需要调用setSize()方法来设置窗口的大小,并调用setVisible()来显示窗口。8容器-面板•面板不是一个单独的窗口,它只是包含在窗口中的一个区域。•面板是可以将许多组件组合起来的一种容器。•最简单的创建面板的方式就是通过面板的构造函数Panel()来进行。•必须将面板添加到窗体中。9使用容器示例importjava.awt.*;classPanelTestextendsPanel{publicstaticvoidmain(Stringargs[]){PanelTestp=newPanelTest();Framef=newFrame(正在测试面板!);f.add(p);f.setSize(300,200);f.setVisible(true);}}使用GUI组件必须导入该包将面板添加到框架窗体中10AWT组件•组件指可以放置在用户界面上的任何东西,可以将组件设置为可见或重新调整其大小。•AWT支持的组件:标签、文本域、文本区、按钮、复选框、选择框等。•高级组件包括滚动条、滚动窗格和对话框。•向窗口加入一个组件:首先生成所需组件的实例,然后调用add()方法,此方法是在Container类中定义的。11不同组件标签文本域复选框单选按钮文本区按钮12标签•可以通过以下任一构造函数来创建:–Label():新建一个空标签–Label(Stringlabeltext):新建一个包含给定文本的标签–Label(Stringlabeltext,intalignment):新建一个包含给定对齐方式的标签,对齐方式可以为Label.LEFT、Label.RIGHT或Label.CENTER通常用来指明项目的用途标签不可以被用户编辑13文本域•可以通过以下任一构造函数来创建:-TextField():新建一个文本域-TextField(intcolumns):新建一个包含给定列数的文本域-TextField(Strings):新建一个包含给定字符串的文本域-TextField(Strings,intcolumns):新建一个包含给定字符串和列数的文本域一种用来输入文本的GUI组件只能接受一行输入14标签和文本域使用示例importjava.awt.*;classTextLabelDemoextendsFrame{LabellblName=newLabel(“名称:”);TextFieldtxtName=newTextField(20);publicTextLabelDemo(Stringtitle){super(title);setLayout(newFlowLayout());add(lblName);add(txtName);}publicstaticvoidmain(Stringargs[]){TextLabelDemot=newTextLabelDemo(正在测试组件!);t.setSize(300,200);t.show();}}新建一个标签新建一个文本域添加到窗口15文本区•可以通过以下构造函数来创建:-TextArea():新建一个TextArea-TextArea(introws,intcols):新建一个包含给定行数和列数的TextArea-TextArea(Stringtext,introws,intcols):新建一个包含给定字符串、行数和列数的TextArea要接受输入多行文本时使用可以包括滚动条...TextAreatxtComment=newTextArea();add(txtComment);...16按钮•可以使用以下任一构造函数来创建按钮:-Button():新建一个空的按钮-Button(Stringtext):新建一个包含给定字符串的按钮按钮是任何GUI都不可或缺的组件用来捕捉用户操作的最为简便的方式...ButtonbtnOk=newButton(确定!);ButtonbtnCancel=newButton(取消!);add(btnOk);add(btnCancel);...17复选框•可以使用以下任一构造函数来创建复选框:-Checkbox():创建一个空的复选框,且未被选中-Checkbox(Stringtext):创建一个用给定字符串作为标签的复选框,且未被选中-Checkbox(Stringtext,Booleanon):创建一个标签由参数text指定的复选框,允许通过参数on设定复选框的初始状态。用于多选项的用户输入,用户可以通过单击复选框来选定或取消选定某选项。18单选按钮•可以通过复选框组生成一系列互斥的复选框,实现单选按钮功能。•在一组单选按钮中只能选择一个按钮。•首先创建一个CheckboxGroup对象。CheckboxGroupcg=newCheckboxGroup();•然后再创建各单选按钮。Checkboxmale=Checkbox(男,cg,true);Checkboxfemale=Checkbox(女,cg,false);19复选框和单选按钮使用示例importjava.awt.*;classQualificationextendsFrame{Checkboxt1=newCheckbox(VisualBasic);Checkboxt2=newCheckbox(VisualC++);Checkboxt3=newCheckbox(Java);CheckboxGroupcg=newCheckboxGroup();Checkboxr1=newCheckbox(专科,cg,false);Checkboxr2=newCheckbox(本科,cg,false);Checkboxr3=newCheckbox(硕士,cg,false);Checkboxr4=newCheckbox(博士,cg,false);Labellb1=newLabel(您的学历为:);Labellb2=newLabel(您精通的语言为:);新建复选框新建一个复选框组添加单选按钮publicQualification(Strings){super(s);setLayout(newGridLayout(10,1));add(lb1);add(r1);add(r2);add(r3);add(r4);add(lb2);add(t1);add(t2);add(t3);}publicstaticvoidmain(Stringargs[]){Qualificationq=newQualification(学识!);q.setSize(400,250);q.show();}}将单选按钮添加到窗体将复选框添加到窗体20选择框•用Choice类可以创建一个选择框Choicemoviestars=newChoice();•通过addItem()方法可以添加项目moviestars.addItem(安东尼奥.班德拉斯);moviestars.addItem(莱昂纳多.迪卡普尼奥);moviestars.addItem(桑德.布洛克);moviestars.addItem(休.葛兰特);moviestars.addItem(朱莉亚.罗萡茨);用来向用户显示一个选择列表21Java布局管理器•用户界面上的组件可以按不同方式排列。•Java使用布局管理器来管理这些排列方式。•每当需要重新调整屏幕大小或重新绘制屏幕上任一项目时,就要用到布局管理器。•AWT提供一组用来进行布局管理的类,称为布局管理器或布局。所有布局都实现LayoutManager接口。22布局类型•Java中的布局类型包括以下几种:-FlowLayout(流式布局)-BorderLayout(边界布局)-GridLayout(网格布局)-GridBagLayout(网格包布局)-CardLayout(卡片布局)23布局类型的选用•每个布局管理器都有自己特定的用途。-要按行和列显示几个同样大小的组件,GridLayout会比较合-要在尽可能大的空间里显示一个组件,就要选择BorderLayout或GridBagLayout24如何设置布局•每个容器(Container对象)都有一个与它相关的缺省的布局管理器。-Applet的缺省布局是FlowLayout•在没有设置新的布局前,在容器中添加组件都按照该容器的缺省布局排列。•可以通过setLayout()方法为容器设置新的布局。25FlowLayout•FlowLayout的构造函数有:-FlowLayout():生成一个默认的流式布局-FlowLayout(intalignment):可以设定每一行组件的对齐方式-FlowLayout(intalignment,inthorz,intvert):可以设定组件间的水平和垂直距离Applet和面板的缺省布局组件从左上角开始按从左到右、从上到下的方式排列FlowLayoutmylayout=newFlowLayout();FlowLayoutexLayout=newFlowLayout(FlowLayout.RIGHT);setLayout(exlayout);//为容器设置新布局26BorderLayout2-1•下面是BorderLayout所定义的构造函数:-BorderLayout():生成默认的边界布局-BorderLayout(inthorz,intvert):可以设定组件间的水平和垂直距离窗口、框架和对话框等的缺省布局组件可被置于容器的北、南、东、西或中间位置27BorderLayout2-2•BorderLayout类定义了几个常量值以指定相应区域:-BorderLayout.NORTH–对应容器的顶部-BorderLayout.EAST–对应容器的右部-BorderLayout.SOUTH–对应容器的底部-BorderLayout.WEST–对应容器的左部-BorderLayout.CENTER–对应容器的中部•加入组件方法:voidadd(ComponentObj,intregion);...setLayout(newBorderLayout());ButtonbtnEast=newButton(东);ButtonbtnWest=newButton(西);ButtonbtnNorth=newButton(北);ButtonbtnSouth=newButton(南);ButtonbtnCenter=newButton(中);add(btnEast