第七章AWT组件及事件处理(三)本次课教学目标掌握文本区的事件处理方法掌握面板的使用熟悉各种布局方式,能根据实际需要选择合适的布局方式文本区上的TextEvent事件当改变文本区的内容时,发生TextEvent事件向文本区注册监视器:addTextListener(监视器)处理发生TextEvent事件的接口是TextListenerTextListener中只有一个方法:textValueChanged(TextEvente)例1:如下图所示,当在文本框中输入信息按回车时,将所输入内容显示在文本区2中;当在文本区1中输入信息时,文本区2中的字符跟随文本区1中的输入而变化。importjava.awt.*;importjava.awt.event.*;importjava.applet.*;publicclassUseTextEventextendsAppletimplementsActionListener,TextListener{TextFieldtf;TextAreata1,ta2;publicvoidinit(){tf=newTextField(25);ta1=newTextArea(4,25);ta2=newTextArea(4,25);tf.addActionListener(this);ta1.addTextListener(this);add(tf);add(ta1);add(ta2);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==tf)ta2.setText(tf.getText());}publicvoidtextValueChanged(TextEvente){if(e.getSource()==ta1)ta2.setText(ta1.getText());}}面板面板(Panel):是最简单的容器类(Container的子类),程序可以在面板提供的空间里放置任意组件及其它的面板。Panel():使用默认的布局管理器创建一个新的面板。默认的布局管理器为FlowLayout。滚动面板(ScrollPane)也是Container的子类,但只能向滚动面板中添加一个组件。ScrollPane():创建滚动面板,滚动条初始不可见。ScrollPane(inta):用指定的参数创建一个滚动面板。a的取值为:Scrollpane.SCROLLBARS-ALWAYSScrollpane.SCROLLBARS-AS-NEEDEDScrollpane.SCROLLBARS-NEVER例2:程序的运行效果如下图所示。importjava.awt.*;importjava.awt.event.*;classMypanelextendsPanelimplementsActionListener{Buttonbutton1,button2;ColorbackColor;Mypanel(){button1=newButton(确定);button2=newButton(取消);add(button1);add(button2);setBackground(Color.pink);backColor=getBackground();button1.addActionListener(this);button2.addActionListener(this);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==button1){setBackground(Color.cyan);}elseif(e.getSource()==button2){setBackground(backColor);}}}classWindowPanelextendsFrameimplementsActionListener{Mypanelpanel1;Panelp;ScrollPanescrollpane;Buttonbutton;WindowPanel(Strings){super(s);setLayout(newFlowLayout());panel1=newMypanel();p=newPanel();scrollpane=newScrollPane(ScrollPane.SCROLLBARS_ALWAYS);p.add(newButton(one));p.add(newButton(two));p.add(newButton(three));p.add(newButton(four));scrollpane.add(p);button=newButton(退出);add(panel1);add(scrollpane);add(button);button.addActionListener(this);setBounds(60,60,200,200);setVisible(true);validate();}滚动面板中只能放一个组件,所以先将4个按钮放面板中,再将面板放滚动面板中。publicvoidactionPerformed(ActionEvente){System.exit(0);}}publicclassUsePanel{publicstaticvoidmain(Stringargs[]){newWindowPanel(面板的使用);}}布局布局设计即控制组件在容器中的位置容器可以使用:setLayout(布局对象);来设置自己的布局。java.awt包中的布局类有:FlowLayoutBorderLayoutCardLayoutGridLayoutjava.swing.border包中的布局类有:BoxLayoutFlowLayout布局(按行/流式布局):是最简单的布局管理器,也是AWT中面板类采用的缺省布局方式。它的布局原则是将组件从左向右、从上向下排列,如果本行放不下这个组件,就放入下一行,每一行中的组件都居中对齐,组件之间的默认水平和垂直间隙是5个像素。其构造方法如下:FlowLayout():构建一个新的按行布局管理器,中央对齐,对象之间以默认的5个像素点水平和垂直间隔。FlowLayout(intalign):构建一个新的按行布局管理器,通过align设置对齐方式,对象之间以默认的5个像素点水平和垂直间隔。Align的值可为:FlowLayout.LEFTFlowLayout.CENTERFlowLayout.RIGHTFlowLayout(intalign,inthgap,intvgap):构建一个新的按行布局管理器,通过align设置对齐方式,对象之间以hgap单元水平间隔并以vgap单元垂直间隔。成员方法:setAlignment(intalign)//重新设置布局的对齐方式setHgap(inthgap)//重新设置布局的水平间隙setVgap(intvgap)//重新设置布局的垂直间隙例3:使用FlowLayout布局放置10个组件,要求组件左对齐,组件之间的水平间隔为2个像素,垂直间隔为8个像素。importjava.awt.*;classWindowFlowextendsFrame{WindowFlow(Strings){super(s);FlowLayoutflow=newFlowLayout(FlowLayout.LEFT,2,8);setLayout(flow);for(inti=1;i=10;i++){Buttonb=newButton(iam+i);add(b);}setBounds(100,100,250,200);setVisible(true);}}publicclassFlowLayoutDemo{publicstaticvoidmain(Stringargs[]){WindowFlowwin=newWindowFlow(FlowLayout布局窗口);}}BorderLayout布局(边界式布局):是Window型容器的默认布局,将一个容器分为北(NORTH)、南(SOUTH)、东(EAST)、西(WEST)和中央(CENTER)五部分。其构造方法如下:BorderLayout():构建一个新的边界式布局,对象之间没有间隔。BorderLayout(inthgap,intvgap):构建一个新的边界式布局,对象之间的水平间隔为hgap,垂直间隔为vgap。说明:要使用“边界式布局设置”时,必须先产生BorderLayout类的对象,再将此对象传给setLayout()方法,即可将容器设置为“边界式布局”。1、容器.setLayout(newBorderLayout());2、容器.add(BorderLayout.CENTER,组件1);或容器.add(组件1,BorderLayout.NORTH);或容器.add(“South”,组件1);在边界式布局中,每个区域只能放一个组件,该组件将占据整个区域。例4:实现上图的布局效果。importjava.awt.*;importjava.awt.event.*;importjava.applet.*;publicclassBorderDemoextendsApplet{publicvoidinit(){setFont(newFont(,Font.ITALIC,30));setLayout(newBorderLayout());add(North,newButton(北));add(South,newButton(南));add(West,newButton(西));add(East,newButton(东));add(Center,newButton(中));}}CardLayout(卡片式布局)将每个组件看作一张卡片,一个容器中可以加入多张卡片,但每次只有一个可见。也称“多层页面设置”,它把每一个组件都视为容器中的一层,每一个组件都会布满整个容器。这些组件都会赋予一个名称,然后再依这个名称来控制组件是否显示。假设有一个容器con,使用CardLayout的一般步骤:1、创建CardLayout布局对象如:CardLayoutcard=newCardLayout();2、使用setLayout()为容器设置布局如:con.setLayout(card);3、容器调用add(Strings,Componentb)方法添加组件,并给出了显示该组件的代号s(别名)。最先加入的为第1张,依次排序.4、该CardLayout对象调用下列方法可以显示组件:card.first(con);移到con的第一个组件;card.last(con);移到con的最后一个组件;card.next(con);移到当前显示组件的下一个组件;card.previous(con);移到当前显示组件的前一个组件;card.show(con,s);显示指定的组件。例5:一个使用CardLayout的简单例子,单击其上的按钮,在图中的两个画面间转换。importjava.awt.*;importjava.awt.event.*;importjava.applet.*;publicclassCardDemoextendsAppletimplementsActionListener{Buttonb1=newButton(显示第二张卡片);Buttonb2=newButton(显示第一张卡片);Panelp1=newPanel();Panelp2=newPanel();CardLayoutcl=newCardLayout();publicvoidinit(){setLayout(cl);add(card1,p1);//p1为第一张卡片add(card2,p2);//p2为第二张卡片p1.add(newLabel(第一张卡片));p1.add