第6章Java程序设计概述6.1Java的GUI6.2用AWT生成图形化用户界面6.3常用容器6.4布局管理器6.5AWT事件处理模型6.6AWT常用组件6.1Java的GUI图形用户界面(Graphicsuserinterface,GUI)是指用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便操作程序,并将系统运行的结果以图形方式显示给用户的技术。目前Java主要提供了两个处理图形用户界面的类库:java.awt和javax.swing。设计和实现图形用户界面的工作主要有:一是应用的外观设计,即创建组成图形界面的各部件,指定其位置和属性关系,构成完整的图形用户界面二是处理与用户的交互事件,包括定义各部件对不同事件的响应处理。按下监听器一按钮事件处理方法监听器二文本框事件处理方法按钮动作事件回车文本事件设计顺序:1、窗口布局2、为组件注册事件监听器3、监听器设计(事件处理代码)需要了解:1、布局控制方法2、了解每种组件常用方法和可触发的事件3、了解每种事件对应的监听器importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;publicclassFrameClickextendsFrame{Buttonb1=newButton(单击);intn=0;publicFrameClick(Stringname){super(name);this.setLayout(newFlowLayout);this.add(b1);b1.addActionListener(newB1Listener());this.setSize(200,200);this.setVisible(true);}窗口类为按钮注册事件监听器classB1ListenerimplementsActionListener{publicvoidactionPerformed(ActionEvente){if(e.getSource()==b1){n++;b1.setLabel(单击+n+次);validate();}}}publicstaticvoidmain(String[]args){newFrameClick(ClickButton!);}}按钮事件监听器事件处理方法按钮单击事件6.2用AWT生成图形化用户界面AWT基本组件AWT容器组件表6-1Component类常用方法Component类常用方法方法说明protectedComponent()构造一个新组件。StringgetName()获得组件的名称。setName(Stringname)设置组件的名称ComponentgetComponentAt(intx,inty)返回在(x,y)位置的组件ColorgetForeground()获得组件的前景色。setForeground(Colorc)设置组件前景色setBackground(Colorc)设置组件背景色setFont(Fontf)设置组件的字体。Component类常用方法方法说明setSize(intwidth,intheight)返回组件的大小paint(Graphicsg)绘制组件repaint()重绘组件setBounds(intx,inty,intwidth,intheight)设置组件的大小和位置setVisible(booleanb)设置组件可见性setCursor(Cursorc)设置鼠标指向组件时的光标形状。validate()将变化后的界面显示出来setEnabled(booleanb)更新组件6.3常用容器容器java.awt.Container本身也是一个组件,具有组件的所有性质但是它的主要功能是容纳其它组件和容器容器通过add()方法向容器中添加组件。有三种类型的常用容器:Frame、Panel、ScrollPane。6.3.1FrameFrame类是Container类的间接子类可以向窗口添加组件顶层容器,不容许被添加默认布局是BorderLayout产生WindowEvent事件Frame常用方法1.Frame()2.Frame(Strings)3.publicvoidsetBounds(inta,intb,intwidth,intheight)4.publicvoidsetSize(intwidth,intheight)5.publicvoidsetVisible(booleanb)6.publicvoidsetResizable(booleanb)7.publicvoidpack();P132【例6-1】Frame容器例子6.3.2Panel——面板java.awt.Panel类Container(容器)的子类,属内层容器在外层容器内部实现分块布局默认布局是FlowLayout布局常用方法同Framejava.awt.ScrollPane类——滚动面板P133【例6-2】使用Panel容器6.3.3ScrollPanejava.awt.ScrollPane——滚动面板通过滚动条来观察每个组件只能向滚动面板添加一个组件构造方法ScrollPane()ScrollPane(inta)a的取值:1)SCROLLBARS_ALWAYS、2)SCROLLBARS_AS_NEEDED、3)SCROLLBARS_NEVERP134【例6-3】使用ScrollPane容器6.4布局管理器布局管理器(LayoutManager)用来管理组件在容器中的布局具有良好的平台无关性,实现跨平台的特性获得动态的布局效果容器可以通过选择不同的布局管理器来决定布局分布模式布局管理器主要包括:FlowLayout、BorderLayout、GridLayout、CardLayout、GridBagLayout程序中安排组件的位置和大小时,应注意1.布局管理器负责各个组件的大小和位置,用户无法通过setLocation(),setSize(),setBounds()等方法,设置组件的这些属性。这些设置都会被布局管理器屏蔽。2.注意窗口变化时,组建的变化规律3.如果用户确实需要亲自设置组件大小或位置,则应调用setLayout(null)方法取消该容器的布局管理器。修改前一个案例,测试为容器定义布局管理器过程1.创建布局管理器:FlowLayoutfl=newFlowLayout();2.使用容器的setLayout方法设置布局con.setLayout(fl);3.调用容器的add()方法将组件加入容器con.add(b1);6.4.1FlowLayout流式布局java.awt.FlowLayout是Panel和Applet的默认的布局管理器组件的布局规律是先从左至右排满第一行,再排第二行,以此类推构造方法:FlowLayout(intalign,inthgap,intvgap);第一个参数设置组件的水平对齐方式第二个参数是组件之间的横向间隔第三个参数是组件之间的纵向间隔FlowLayout(intalign);横向间隔和纵向间隔都是缺省值5个像素。FlowLayout();默认居中对齐,横向和纵向间隔为5个像素Align的取值:staticintFlowLayout.CENTERstaticintFlowLayout.LEFTstaticintFlowLayout.RIGHTFlowLayout常用方法:setAlignment(intalign)setHgap(inthgap)setVgap(intvgap)P136【例6-5】FlowLayout布局管理器BorderLayout框架布局BorderLayoutWindow、Frame和Dialog的缺省布局管理器把容器分成5个区域:布局常量——EAST、WEST、NORTH、SOUTH、CENTER每个区域只能放置一个组件。构造方法:publicBorderLayout()publicBorderLayout(inthgap,intvgap)BorderLayout常用方法setHgap(inthgap)setVgap(intvgap)向一个使用BorderLayout布局的容器con中添加组件bCon.add(b,BorderLayout.CENTER)Con.add(BorderLayout.CENTER,b)P137【例6-7】BorderLayout布局管理器6.4.3GridLayout网格布局把容器划分成若干行乘若干列的网格区域每个网格都是相同大小并且强制组件与网格的大小相同为了克服这个缺点,可以使用容器嵌套组件定位比较精确构造方法:GridLayout()GridLayout(introws,intcols)GridLayout(introws,intcols,inthgap,intvgap)GridLayout常用方法setColumns(intcols)setRows(introws)setVgap(intvgap)setHgap(inthgap)P138【例6-8】GridLayout布局管理器6.4.4CardLayout牌布局CardLayout牌布局管理器象一副叠得整整齐齐的扑克牌一样每次只能看见最上面的一张牌每张牌占据每一层整个大小CardLayout常用方法将组件添加入使用CardLayout布局的容器内con.add(Strings,Componentb)con.add(Componentb,Strings)card.show(con,s)card.first(con)card.last(con)card.previous(con)card.next(con)P139【例6-9】CardLayout布局管理器6.4.6总结1.Frame是一个顶级窗口。缺省布局管理器为BorderLayout2.Panel内层容器中。缺省布局管理器为FlowLayout。3.使用容器嵌套可达到设计复杂用户界面的目的4.如果采用无布局管理器setLayout(null),则必须使用setLocation();setSize();setBounds()等方法手工设置组件的大小和位置,但是此方法会导致平台相关,不鼓励使用PublicclassNullLayout{publicNullLayout(){Framef=newFrame();f.setLayout(null);Buttonb1=newButton(“one”);Buttonb2=newButton(“two”);b1.setBounds(50,80,80,30);b2.setBounds(50,150,80,30);f.add(b1);f.add(b2);f.setBounds(20,20,200,200);f.setVisible(true);}}NewNullLayout();6.5AWT事件处理模型前面的主要内容是如何放置各种组件,使图形界面更加丰富多彩,但是还不能响应用户的任何操作,要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制。6.5.1事件处理机制在事件处理的过程中,涉及三类对象:事件:用户在组件上的交互性操作,用类表示事件源:能够产生事件的对象,通常是各个组件,例如按钮Button、TextField等。事件监听器:接收事件对象并对其进行处理的对象。监听器必须实现相应监听器接口。为事件源指定事件监听器,即事件处理对象:事件源.addXXListener(事件监听器对象)Java事件处理模型使用授权处理模型进行事件处理的一般方法归纳如下:1.对于某类事件XXXEvent,要想接收并处理这类事件,必须定义相应的事件监听器类,该类需要实现与该事件相对应的接口XXX