1、1第第5章章 构成用户界面的窗口环境构成用户界面的窗口环境北京大学计算机系北京大学计算机系代亚非代亚非2构成用户界面的窗口环境构成用户界面的窗口环境45.1 使用使用AWT(Abstract Window Toolkit)构件构件45.2 包含包含构件的构件的构件构件-构件容器(构件容器(container)45.3 事件的传递事件的传递45.4 各种构件的应用实例各种构件的应用实例(一一)45.5 外观的管理与控制外观的管理与控制45.6 各种构件的应用实例各种构件的应用实例(二二)45.7 总结总结35.1 使用使用AWT构件构件4在在AWT的概念中,窗口系统所显示的各种对象的概念中,窗口
2、系统所显示的各种对象统称为构件:统称为构件:Button,Menu,List等等都是构等等都是构件。件。4Component是代表构件最基本的类。是代表构件最基本的类。4Component类中定义了各种窗口对象中最基本、类中定义了各种窗口对象中最基本、最重要的方法和性质。随时随处都有可能利用最重要的方法和性质。随时随处都有可能利用Component定义的方法。定义的方法。45.1 使用使用AWT构件构件4已经学过的:已经学过的:4getFont,4handleEvent,keyUp4keyDown,mouseUp,4mouseDown,4mouseMove,4mouseEnter,4mouse
3、Exit,4mouseDrag,repaint4setFont,resize4没有学过的:没有学过的:4action,disable,enable,4getBackground,4getForeground,hide,4inside,isEnable,4isShowing,isVisible,4locate,location,4move,setBackground,4setForeground,show,4size5列表列表按钮按钮菜单菜单container另一个窗口另一个窗口窗口,对话框窗口,对话框5.2 包含包含构件的构件的构件构件-构件容器构件容器(container)container
4、65.2 包含包含构件的构件的构件构件-构件容器构件容器(container)import java.awt.*;import java.applet.Applet;public class CountClick extends Applet int CurrentMarks=0;public init()Button b1=new Button(“按钮”);add.b1;按钮按钮75.2 包含包含构件的构件的构件构件-构件容器构件容器(container)4AWT使用使用Container类类来定义最基本的来定义最基本的构件容构件容器器,它有两个子类它有两个子类:Window类和类和Pane
5、l类类.4在在Window类类还有两个子类还有两个子类41.定义对话框定义对话框,用用Dialog子类子类;4Java还提了一个还提了一个Dialog的子类的子类-FileDialog,用用它生成文件对话框它生成文件对话框42.定义一般意义的窗口定义一般意义的窗口,用用Frame类类.85.2 包含包含构件的构件的构件构件-构件容器构件容器(container)4Panel干什么用的呢干什么用的呢?4使你更方便的组织你的使你更方便的组织你的构件构件,得到赏心悦目的布得到赏心悦目的布局局4Applet是是Panel的子类的子类,因此在小应用程序里可因此在小应用程序里可以直接加入构件以直接加入构件
6、,而一般的应用程序必须先定义而一般的应用程序必须先定义构件容器构件容器.4小应用程序在浏览器中所显示的区域就是小应用程序在浏览器中所显示的区域就是Panel,所占的尺寸就是缺省得所占的尺寸就是缺省得Panel尺寸尺寸.9ContainerWindowPanelComponentFrameDialogFileDialogApplet5.2 包含包含构件的构件的构件构件-构件容器构件容器(container)ButtonMenuCheckboxTextfield105.3 事件的传递事件的传递(1.02)当动作发生在按钮上时当动作发生在按钮上时,首先看按钮这个类有没首先看按钮这个类有没有有acti
7、on方法方法,如果没有如果没有则看包含按钮的容器类则看包含按钮的容器类(即即panel)有没有有没有action方法方法,如果没有事件就如果没有事件就传递窗口传递窗口,如果没有就如果没有就传递给传递给 component的通的通用处理方法用处理方法,如果程序如果程序中没有定义任何中没有定义任何action方法方法,实际上事件最终实际上事件最终不被处理不被处理窗口窗口按钮按钮panel11class MyPanel extends Panel MyBtn b=new MyBtn(“ok”);add(b);boolean action().;class MyClass extends Frame
8、MyPanel p=new Mypanel();add(p);Button b=new Button(exit);add(b);boolean action().;窗口窗口exitclass MyBtn extends Button boolean action().;return true;okPanel125.3事件的传递事件的传递(1.02)4事件由包含层次由内向外传递事件由包含层次由内向外传递.4每个处理事件的方法要有一个返回值每个处理事件的方法要有一个返回值,通知是否通知是否继续向上传递继续向上传递 boolean action(Event evt,Object arg);retur
9、n true;135.3 事件的传递事件的传递(1.1)窗口窗口buttonpanel按钮的监听器按钮的监听器窗口获面板窗口获面板的监听器的监听器14确定确定取消取消5.4 各种构件的应用实例各种构件的应用实例-按钮按钮4Button类类4功能功能:创建按钮事件创建按钮事件4创建一个创建一个Button4Button myButton=new Button(str);4将将button放到窗口系统中放到窗口系统中:4 add(new Button(“确定确定”);4 add(new Button(“取消取消”);4Button类的常用方法类的常用方法4 getLabel setLabel15a
10、ction-接受动作事件接受动作事件,调用调用repaintinit-建立建立buttonpaint-显示文字显示文字5.4 各种构件的应用实例各种构件的应用实例-按钮按钮4处理处理button产生的事件产生的事件4例例:创建一个按钮创建一个按钮,每当按下它时每当按下它时,在屏幕显示文在屏幕显示文字字(singlebutton.html)4想一想想一想:4应该有哪些类应该有哪些类?Button,Font;4应有哪些方法应有哪些方法?16import java.awt.*;import java.applet.Applet;public class button extends Applet F
11、ont font;Button b1;public void init()font=newFont(TimesRoman,Font.BOLD,20);b1=new Button(push);add(b1);setFont(font);5.4 各种构件的应用实例各种构件的应用实例-按钮按钮175.4 各种构件的应用实例各种构件的应用实例-按钮按钮4boolean action(Event evt,Object arg)4 y+=5;repaint();4 return true;44paint(Graphics g)4 g.drawString(Button”,10,y);185.4 各种构件的
12、应用实例各种构件的应用实例-按钮按钮import java.awt.*;例例:不在不在applet中的按钮中的按钮class ButtoninFrame public static void main(String args)Frame myframe=new Frame();myframe.setTitle(Button in Frame);myframe.resize(200,200);myframe.show();Button b1=new Button(Button1);Button b2=new Button(Button2);myframe.add(b1);myframe.add(
13、b2);.195.4 各种构件的应用实例各种构件的应用实例4一般步骤一般步骤:创建创建 new加入加入 add响应响应 action处理处理205.4 各种构件的应用实例各种构件的应用实例SportsComputerMusicArtSportsComputerMusicArtminmaxstart1New Checkbox(label,null,false);CheckboxGroup gr=new CheckboxGroup();New Checkbox(label,gr,false);New Checkbox(label,gr,true);New TextField(20);常用的方法常用
14、的方法 getText();setText();setEchoCharacter(char c)Scrollbar(VERTICAL,50,0,1,100);new TextArea(“this is a test”,20,40);215.4 各种构件的应用实例各种构件的应用实例-CheckBox4应用举例应用举例4建立三个复选框建立三个复选框,被选中者的标签内容变成被选中者的标签内容变成“changes”应有的类应有的类:Checkbox 应有的方法应有的方法:init:建立复选框建立复选框 action:接受动作事件接受动作事件 setLabel(“*”);225.4 各种构件的应用实例各
15、种构件的应用实例-CheckBoximport java.awt.*;public class checkbox extends java.applet.Applet Checkbox b1,b2,b3;public void init()b1=new Checkbox(Label1,null,false);b2=new Checkbox(Label2,null,false);b3=new Checkbox(Label3,null,false);add(b1);add(b2);add(b3);23public boolean action(Event evt,Object arg)if(evt
16、.target instanceof Checkbox)Checkbox selectedbox=(Checkbox)evt.target;String str=selectedbox.getLabel();if(str=Label1)selectedbox.setLabel(Chnage1);else if(str=Label2)selectedbox.setLabel(Chnage2);else if(str=Label3)selctedbox.setLabel(Change3);repaint();return true;5.4 各种构件的应用实例各种构件的应用实例-CheckBox24
17、4例例:在文本行中输入在文本行中输入,并用字符串接受并用字符串接受,显示出来显示出来4类的数据构成类的数据构成:Textfield,Button,String4类的方法构成类的方法构成:4init(),4action():接受按钮事件接受按钮事件,调用调用paint()4paint():用用getText()方法得到输入内容方法得到输入内容,并显示并显示.5.4 各种构件的应用实例各种构件的应用实例-TextField25import java.awt.*;public class textfieldkey extends java.applet.Applet TextField t;Stri
18、ng s;Button button;public void init()t=new TextField(,25);add(t);button=new Button(getText);add(button);5.4 各种构件的应用实例各种构件的应用实例-TextField26public boolean action(Event evt,Object arg)if(evt.target instanceof Button)repaint();return true;public void paint(Graphics g)s=t.getText();g.drawString(s,40,80);
19、5.4 各种构件的应用实例各种构件的应用实例-TextField270124354015345.5 外观的管理与制外观的管理与制28button1button2button4button35.5 外观的管理与制外观的管理与制4Panel类类(面板面板)4功能功能:容纳其他对象容纳其他对象,安排合理布局安排合理布局4创建面板创建面板:4 Panel myPanel=new Panel();4 add(myPanel);4将面板作为容器将面板作为容器:4 mypanel.add(button)295.5 外观的管理与制外观的管理与制4例例:(panel.htm)import java.awt.*;
20、public class Panel extends java.applet.Applet Panel panel1,panel2;Button button1,button2,button3,button4;public void init()panel1=new Panel();panel2=new Panel();add(panel1);add(panel2);button1=new Button(Button1);button2=new Button(Button2);button3=new Button(Button3);button4=new Button(Button4);pan
21、el1.add(button1);panel1.add(button2);panel2.add(button3);panel2.add(button4);30南南中中北北西西东东5.5 外观的管理与制外观的管理与制4BorderLayout类类4功能功能:Applet分成五个区分成五个区4创建创建 4setLayout(new BorderLayout();4将其他构件加入将其他构件加入4add(“East”,new Button(“东东”);4add(“South”,new Button(“南南”);4add(“West”,new Button(“西西”);4add(“North”,new
22、Button(“北北”);4add(“Center”,new Button(“中中”);315.5 外观的管理与制外观的管理与制4FlowLayout类类4缺省的输出管理器缺省的输出管理器4GridLayout类类4GridLayout mylayout=new 4GridLayout(3,3,0,0)4setLayout();rowscolshspacevspace325.5 外观的管理与制外观的管理与制4GridBagLayout类和类和4 GridBagConstraints类类4功能功能:借助于借助于GridBagConstraints类类,实现更灵活实现更灵活的外观管理的外观管理4每
23、个构件后都跟随一个每个构件后都跟随一个GridBagLayout对象实对象实体体,来决定构件的外观来决定构件的外观.4创建创建4 GridBagLayout myLayout=new 4 GridBagLayout();335.5 外观的管理与制外观的管理与制4GridBagConstraints类的约束条件类的约束条件gridwidth,gridheight,gridx,gridy,4 weightx,weighty,ipadx,ipady,insets 4 fill及其设置及其设置4 GridBagConstraints.NONE4 GridBagConstraints.HORIZONTA
24、L4 GridBagConstraints.VERTICAL4 GridBagConstraints.BOTH4 GridBagConstraints.RELATIVE34button1button2button3button8button5button6button7button4button95.5 外观的管理与制外观的管理与制4例例:(GridBagApplet.html)355.5 外观的管理与制外观的管理与制public void init()GridBagLayout layout=new GridBagLayout();setLayout(layout);GridBagConst
25、raints GBC=new GridBagConstraints();Button button1=new Button(button1);Button button2=new Button(button2);Button button3=new Button(button3);Button button4=new Button(button4);Button button5=new Button(button5);Button button6=new Button(button6);Button button7=new Button(button7);Button button8=new
26、Button(button8);Button button9=new Button(button9);365.5 外观的管理与制外观的管理与制GBC.fill=GridBagConstraints.BOTH;(按钮可以在水平和垂直两个方向扩展按钮可以在水平和垂直两个方向扩展)layout.setConstraints(button1,GBC);add(button1);GBC.gridwidth=GridBagConstraints.RELATIVE;(BOTH依然起作用依然起作用,紧挨着最后一个按钮紧挨着最后一个按钮,)layout.setConstraints(button2,GBC);a
27、dd(button2);GBC.gridwidth=GridBagConstraints.REMAINDER;(填充剩余部分填充剩余部分)layout.setConstraints(button3,GBC);add(button3);But1But2But337But1But2But3But45.5 外观的管理与制外观的管理与制4GBC.gridwidth=GridBagConstraints.REMAINDER;4(表示该按钮独占一行表示该按钮独占一行)4layout.setConstraints(button4,GBC);4add(button4);38But1But2But3But4Bu
28、t6But55.5 外观的管理与制外观的管理与制4GBC.gridwidth=2;4(表示该按钮占两个单元表示该按钮占两个单元)4layout.setConstraints(button5,GBC);4add(button5);4GBC.gridwidth=4 GridBagConstraints.REMAINDER;4layout.setConstraints(button6,GBC);4add(button6);39But1But2But3But4But6But5But75.5 外观的管理与制外观的管理与制4GBC.gridwidth=1;4GBC.gridheight=2;4(高度为两个
29、单元高度为两个单元)4layout.setConstraints(button7,GBC);4add(button7);40But1But2But3But4But6But5But7But8But95.5 外观的管理与制外观的管理与制4GBC.gridwidth=GridBagConstraints.REMAINDER;4GBC.gridheight=1;4layout.setConstraints(button8,GBC);4add(button8);4layout.setConstraints4(button9,GBC);4add(button9);415.6 各种构件的应用实例各种构件的应
30、用实例-Canvas45.6.2 Canvas类类(画布画布)4功能功能:制作其他构件制作其他构件,通常用来放置图形图像通常用来放置图形图像,或或绘图绘图.4画图可以直接在画图可以直接在applet区域上进行区域上进行,定义了定义了 Canvas对象后将对象后将paint()语句作为该对象的方法语句作为该对象的方法,这些动作就自动发生在画布区这些动作就自动发生在画布区.4通常不需要处理画布上发生的事件通常不需要处理画布上发生的事件4创建创建4 Canvas canvas=new Canvas();4 add(canvas);425.6 各种构件的应用实例各种构件的应用实例-Canvas4例例:
31、根据程序说出运行结果根据程序说出运行结果4注意一个程序中生成一个注意一个程序中生成一个canvas类的实例类的实例,另一另一个程序没有个程序没有435.6 各种构件的应用实例各种构件的应用实例-Canvasimport java.awt.*;import java.applet.*;public class canvas_test_2 extends Applet public void init()setLayout(new BorderLayout();add(North,new Button(button1);add(South,new Button(button2);add(West,
32、new Button(button3);add(East,new Button(button4);public void paint(Graphics g)g.setColor(Color.red);g.fillRect(0,0,50,100);g.setColor(Color.blue);g.fillRect(30,0,100,40);445.6 各种构件的应用实例各种构件的应用实例-Canvasimport java.awt.*;import java.applet.*;public class canvas_test extends Applet MyCanvas mycanvas=ne
33、w MyCanvas();public void init()setLayout(new BorderLayout();add(Center,mycanvas);add(North,new Button(button1);.;add(East,new Button(button4);455.6 各种构件的应用实例各种构件的应用实例-Canvasclass MyCanvas extends Canvas public void paint(Graphics g)g.setColor(Color.red);g.fillRect(0,0,50,100);g.setColor(Color.blue);
34、g.fillRect(30,0,100,40);465.6 各种构件的应用实例各种构件的应用实例-Canvas47利用输出管理利用输出管理器按钮和画布器按钮和画布按钮接收按钮接收鼠标事件鼠标事件变换颜色变换颜色执行重画执行重画colorcolorcolor5.6 各种构件的应用实例各种构件的应用实例-Canvas4例例:按动鼠标改变画布的颜色按动鼠标改变画布的颜色(CanvasApplet)4有哪些类有哪些类?Canvas,Button,Color;4哪些方法哪些方法?init(),action(),swapColor(),paint()48class CanvasApplet extends
35、 Applet MyCanvas mycanvas=new MyCanvas();public void init()setLayout(new BorderLayout();Button button=new Button(Color);add(North,button);add(“Center”,mycanvas);resize(200,250);5.6 各种构件的应用实例各种构件的应用实例-Canvas.495.6 各种构件的应用实例各种构件的应用实例-Canvas4boolean action(Event evt,Object arg)44 if(arg=Color)mycanvas.
36、swapColor();4 return true;4505.6 各种构件的应用实例各种构件的应用实例-Canvasclass MyCanvas extends Canvas Color color;MyCanvas()color=Color.red;public void paint(Graphics g)g.setColor(color);g.fillRect(20,20,100,100);g.setColor(color.white);g.drawString(CANVAS,40,40);public void swapColor()if(color=Color.black)color=
37、Color.red;else if(color=Color.red)color=Color.green;else color=Color.black;repaint();.515.6 各种构件的应用实例各种构件的应用实例-Frame45.6.3 Frame类类4功能功能:制作一般的独立窗口制作一般的独立窗口,它是构件容器它是构件容器4创建创建4 Frame fmInstance=new Frame();4或或 Frame fmInstance=4 new Frame(“The window for test”);4将其显示到屏幕上将其显示到屏幕上4 fmInstance.show()4注意注意
38、:不用不用add()525.6 各种构件的应用实例各种构件的应用实例-Frame4常用的方法常用的方法4 dispose,getCursorType,getIconImage,4 getMenuBar,getTitle,isResizable,4 setCursor,setIconImage,setMenuBar,4 setResizable,setTitle4窗口的相关事件窗口的相关事件:4Event.WINDOW_DEICONIFY,4 _DESTROY4 _EXPOSE,4 _ICONIFY,4 _MOVED535.6 各种构件的应用实例各种构件的应用实例-Frame4例例:创建一个窗口
39、创建一个窗口,并用按钮控制它的显示或并用按钮控制它的显示或4隐藏隐藏 FrameAppletFrame WindowThis is CustomFrame windowShow windowhide windowShow window545.6 各种构件的应用实例各种构件的应用实例-Frame4在在applet中中action处理处理Button的事件的事件action捕获捕获buttonFrame.showFrame.hidebutton.label is showbutton.label is hide555.6 各种构件的应用实例各种构件的应用实例-Frame4.Frame Window
40、This is CustomFrame window为了将字符显为了将字符显示在自定义窗示在自定义窗口中口中,包含输出包含输出语句的方法必语句的方法必须在自定义的须在自定义的窗口类中窗口类中关闭窗口的事件在窗口类本身处理关闭窗口的事件在窗口类本身处理.注注:处理窗口中的事件用处理窗口中的事件用handelEvent()public boolean handleEvent(Event evt)switch(evt.id)case Event.WINDOW_DESTROY:dispose();System.exit(0);default:return super.handleEvent(evt);
41、565.6 各种构件的应用实例各种构件的应用实例-Framepublic class FrameApplet extends Applet CustomFrame frame;Button button;public void init()frame=new CustomFrame (Custom Frame Window);button=new Button(Show Window);add(button);public boolean action(Event evt,Object arg)boolean visible=frame.isShowing();if(visible)frame
42、.hide();button.setLabel(Show window);else frame.show();button.setLabel(Hide Window);return true;575.6 各种构件的应用实例各种构件的应用实例-Frameclass CustomFrame extends Frame CustomFrame(String title)super(title);public boolean handleEvent(Event evt)switch(evt.id)case Event.WINDOW_DESTROY:dispose();System.exit(0);de
43、fault:return super.handleEvent(evt);public void paint(Graphics g)resize(200,100);g.drawString(this is a custom window.,30,30);58button2button1Button1 10button2 1button2button1Button1 0button2 75.6 各种构件的应用实例各种构件的应用实例-Frame4多窗口多窗口(FrameAppletButtonsFrames.class-f1.bat)595.6 各种构件的应用实例各种构件的应用实例-Frame1.一
44、个窗口类创建两个实例一个窗口类创建两个实例2.由于有不同的事件发生由于有不同的事件发生(按钮按钮,关窗口关窗口),因此事件因此事件先由通用事件处理程序来接收先由通用事件处理程序来接收,然后再根据情况然后再根据情况做相应的处理做相应的处理.switch(evt.id)case Event.WINDOW_DESTROY:dispose();return true;case Event.ACTION_EVENT:return action(evt,evt.arg);default:return super.handleEvent(evt);605.6 各种构件的应用实例各种构件的应用实例-Frame
45、43.任何时候只有一个窗口是活动的任何时候只有一个窗口是活动的(active)的因的因此不必考虑那个判断是哪一个窗口发生的事件此不必考虑那个判断是哪一个窗口发生的事件44.一般的结构一般的结构4在在main()中中,只做与窗口有关的事情只做与窗口有关的事情:创建窗口创建窗口,显示窗口显示窗口4在构造方法中在构造方法中,安排窗口中的构件安排窗口中的构件615.6 各种构件的应用实例各种构件的应用实例-Frameimport java.awt.*;class ButtonsInFrames extends Frame int a1=0,a2=0;public static void main(St
46、ring args)ButtonsInFrames myframe1=new ButtonsInFrames();myframe1.setTitle(Button in Frame1);myframe1.resize(200,200);myframe1.show();ButtonsInFrames myframe2=new ButtonsInFrames();myframe2.setTitle(Button in Frame2);myframe2.resize(200,200);myframe2.show();625.6 各种构件的应用实例各种构件的应用实例-FrameButtonsInFra
47、mes()setLayout(new BorderLayout();Button b1=new Button(Button1);Button b2=new Button(Button2);add(North,b1);add(South,b2);public boolean handleEvent(Event evt)switch(evt.id)case Event.WINDOW_DESTROY:dispose();return true;case Event.ACTION_EVENT:return action(evt,evt.arg);default:return super.handleE
48、vent(evt);635.6 各种构件的应用实例各种构件的应用实例-Frame4public boolean action(Event evt,Object arg)4if(evt.target instanceof Button)4if(arg=Button1)a1+;else a2+;4repaint();4return true;44public void paint(Graphics g)4g.drawString(button1+a1,5,80);4g.drawString(button2+a2,5,100);4.64FontDisplayerFontDisplay!You can
49、 input something here.ArialCourier NewTimes New Roman1820222426Courier New225.6 各种构件的应用实例各种构件的应用实例-练习练习与与List类有关的事件类有关的事件Event.LIST_DESELECT,Event.LIST_SELECT 例例:(FontDisplay.class-f3.bat)public boolean handleEvent(Event evt)switch(evt.id)case Event.WINDOW_DESTROY:dispose();System.exit(0);default:re
50、turn super.handleEvent(evt);.handleEventWINDOW_DESTROYhandleEventLIST_SELECTaddFrame类类Panel类类TextArea类类ListListaddaddaddaraearea.setfont(字型字型,字体字体,字号字号)655.6 各种构件的应用实例各种构件的应用实例-练习练习import java.awt.*;class FontDisplay extends Frame TextArea FontShower;public static void main(String args)FontDisplay m