第5章 构成用户界面的窗口环境 北京大学计算机系 代亚非
构成用户界面的窗口环境 5.1 使用AWT(Abstract Window Toolkit)构件 5.2 包含构件的构件----构件容器(container) 5.3 事件的传递 5.4 各种构件的应用实例(一) 5.5 外观的管理与控制 5.6 各种构件的应用实例(二) 5.7 总结
5.1 使用AWT构件 在AWT的概念中,窗口系统所显示的各种对象统称为构件:Button,Menu,List等等都是构件。 Component是代表构件最基本的类。 Component类中定义了各种窗口对象中最基本、最重要的方法和性质。随时随处都有可能利用Component定义的方法。
5.1 使用AWT构件 已经学过的: 没有学过的: getFont, action, disable,enable, handleEvent,keyUp keyDown,mouseUp, mouseDown, mouseMove, mouseEnter, mouseExit, mouseDrag, repaint setFont,resize 没有学过的: action, disable,enable, getBackground, getForeground,hide, inside,isEnable, isShowing,isVisible, locate,location, move,setBackground, setForeground,show, size
5.2 包含构件的构件----构件容器(container) 列表 按钮 菜单 窗口,对话框 container 另一个窗口 container
5.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; } 按钮
5.2 包含构件的构件----构件容器(container) AWT使用Container类来定义最基本的构件容器,它有两个子类:Window类和Panel类. 在Window类还有两个子类 1. 定义对话框,用Dialog子类; Java还提了一个Dialog的子类---FileDialog, 用它生成文件对话框 2. 定义一般意义的窗口,用Frame类.
5.2 包含构件的构件----构件容器(container) Panel干什么用的呢? 使你更方便的组织你的构件,得到赏心悦目的布局 Applet是Panel的子类,因此在小应用程序里可以直接加入构件,而一般的应用程序必须先定义构件容器. 小应用程序在浏览器中所显示的区域就是Panel,所占的尺寸就是缺省得Panel尺寸.
5.2 包含构件的构件----构件容器(container) Component Container Button Panel Applet Menu Window Textfield Frame Dialog Checkbox FileDialog
5.3 事件的传递(1.02) 当动作发生在按钮上时, 首先看按钮这个类有没有action方法,如果没有则看包含按钮的容器类(即panel)有没有action方法,如果没有事件就传递窗口, 如果没有就传递给 component的通用处理方法,如果程序中没有定义任何action方法,实际上事件最终不被处理 窗口 按钮 panel
class MyClass extends Frame { MyPanel p=new Mypanel(); add(p); Button b=new Button(exit); add(b); boolean action() {…….;} } 窗口 ok Panel exit class MyPanel extends Panel { MyBtn b=new MyBtn(“ok”); add(b); boolean action() {…….;} } class MyBtn extends Button { boolean action() { …….; return true;} }
5.3事件的传递(1.02) 事件由包含层次由内向外传递. 每个处理事件的方法要有一个返回值,通知是否继续向上传递 boolean action(Event evt, Object arg) { ……; return true; }
5.3 事件的传递(1.1) 窗口 button panel 按钮的监听器 窗口获面板的监听器
5.4 各种构件的应用实例--按钮 Button类 功能:创建按钮事件 创建一个Button Button myButton = new Button(str); 将button放到窗口系统中: add(new Button(“确定”); add(new Button(“取消”); Button类的常用方法 getLabel setLabel 确定 取消
5.4 各种构件的应用实例--按钮 处理button产生的事件 例:创建一个按钮,每当按下它时,在屏幕显示文字(singlebutton.html) 想一想: 应该有哪些类? Button ,Font; 应有哪些方法? init---建立button action---接受动作事件,调用repaint paint---显示文字
5.4 各种构件的应用实例--按钮 import java.awt.*;import java.applet.Applet; public class button extends Applet { Font font; Button b1; public void init() { font= newFont("TimesRoman",Font.BOLD,20); b1=new Button("push"); add(b1); setFont(font); }
5.4 各种构件的应用实例--按钮 boolean action(Event evt,Object arg) { y+=5; repaint(); return true; } paint(Graphics g) { g.drawString("Button”, 10,y);}
5.4 各种构件的应用实例--按钮 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(b2); } .
5.4 各种构件的应用实例 一般步骤: 创建 new 加入 add 响应 action 处理
Scrollbar(VERTICAL,50,0,1,100); Sports Computer Music Art 5.4 各种构件的应用实例 Sports Computer Music Art New TextField(20); 常用的方法 getText();setText(); setEchoCharacter(char c) new TextArea( “this is a test”,20,40); Scrollbar(VERTICAL,50,0,1,100); 1 CheckboxGroup gr=new CheckboxGroup(); New Checkbox(label, gr, false); New Checkbox(label,gr,true); New Checkbox(label, null, false); min max start
5.4 各种构件的应用实例--CheckBox 应用举例 建立三个复选框,被选中者的标签内容变成“changes” 应有的方法: init:建立复选框 action:接受动作事件 setLabel(“*****”);
5.4 各种构件的应用实例--CheckBox import 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); }
5.4 各种构件的应用实例--- CheckBox public boolean action(Event evt, Object arg) { if (evt.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 各种构件的应用实例--- TextField 例:在文本行中输入,并用字符串接受,显示出来 类的数据构成:Textfield,Button, String 类的方法构成: init(), action():接受按钮事件,调用paint() paint():用getText()方法得到输入内容,并显示.
5.4 各种构件的应用实例--- TextField import java.awt.*; public class textfieldkey extends java.applet.Applet { TextField t;String s;Button button; public void init() { t=new TextField("",25); add(t); button=new Button("getText"); add(button); }
5.4 各种构件的应用实例--- TextField public 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); }
5.5 外观的管理与制 1 3 1 2 3 4 4 4 5 5
5.5 外观的管理与制 Panel类(面板) 功能:容纳其他对象,安排合理布局 创建面板: Panel myPanel=new Panel(); add(myPanel); 将面板作为容器: mypanel.add(button) button1 button2 button4 button3
5.5 外观的管理与制 import java.awt.*; 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"); panel1.add(button1); panel1.add(button2); panel2.add(button3); panel2.add(button4); }} 5.5 外观的管理与制 例:(panel.htm)
5.5 外观的管理与制 BorderLayout类 功能:Applet分成五个区 创建 setLayout(new BorderLayout()); 将其他构件加入 add(“East”, new Button(“东”); add(“South”, new Button(“南”); add(“West”, new Button(“西”); add(“North”, new Button(“北”); add(“Center”, new Button(“中”); 南 中 北 西 东
5.5 外观的管理与制 FlowLayout类 缺省的输出管理器 GridLayout类 GridLayout mylayout = new setLayout(); rows cols hspace vspace
5.5 外观的管理与制 GridBagLayout类和 GridBagConstraints类 创建 GridBagLayout myLayout=new GridBagLayout();
5.5 外观的管理与制 GridBagConstraints类的约束条件gridwidth, gridheight, gridx, gridy, weightx, weighty, ipadx, ipady, insets fill及其设置 GridBagConstraints.NONE GridBagConstraints.HORIZONTAL GridBagConstraints.VERTICAL GridBagConstraints.BOTH GridBagConstraints.RELATIVE
5.5 外观的管理与制 例:(GridBagApplet.html) button1 button2 button3 button8
5.5 外观的管理与制 public void init() { GridBagLayout layout=new GridBagLayout(); setLayout(layout); GridBagConstraints 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 Button("button8"); Button button9=new Button("button9"); 5.5 外观的管理与制
5.5 外观的管理与制 GBC.fill=GridBagConstraints.BOTH; (按钮可以在水平和垂直两个方向扩展) layout.setConstraints(button1,GBC); add(button1); GBC.gridwidth=GridBagConstraints.RELATIVE; (BOTH依然起作用, 紧挨着最后一个按钮,) layout.setConstraints(button2,GBC); add(button2); GBC.gridwidth=GridBagConstraints.REMAINDER; (填充剩余部分) layout.setConstraints(button3,GBC); add(button3); 5.5 外观的管理与制 But1 But2 But3
5.5 外观的管理与制 GBC.gridwidth= GridBagConstraints.REMAINDER; (表示该按钮独占一行) layout.setConstraints(button4,GBC); add(button4); But1 But2 But3 But4
5.5 外观的管理与制 GBC.gridwidth=2; (表示该按钮占两个单元) layout.setConstraints(button5,GBC); add(button5); GBC.gridwidth= GridBagConstraints.REMAINDER; layout.setConstraints(button6,GBC); add(button6); But1 But2 But3 But4 But6 But5
5.5 外观的管理与制 GBC.gridwidth=1; GBC.gridheight=2; (高度为两个单元) layout.setConstraints(button7,GBC); add(button7); But1 But2 But3 But4 But6 But5 But7
5.5 外观的管理与制 GBC.gridwidth= GridBagConstraints.REMAINDER; GBC.gridheight=1; layout.setConstraints(button8,GBC); add(button8); layout.setConstraints (button9,GBC); add(button9); But1 But2 But3 But4 But6 But5 But7 But8 But9
5.6 各种构件的应用实例---Canvas 5.6.2 Canvas类(画布) 功能: 制作其他构件,通常用来放置图形图像,或绘图. 画图可以直接在applet区域上进行,定义了 Canvas对象后将paint()语句作为该对象的方法,这些动作就自动发生在画布区. 通常不需要处理画布上发生的事件 创建 Canvas canvas=new Canvas(); add(canvas);
5.6 各种构件的应用实例---Canvas 例:根据程序说出运行结果 注意一个程序中生成一个canvas类的实例,另一个程序没有
5.6 各种构件的应用实例---Canvas import 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", 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);} } 5.6 各种构件的应用实例---Canvas
5.6 各种构件的应用实例---Canvas import java.awt.*; import java.applet.*; public class canvas_test extends Applet { MyCanvas mycanvas=new MyCanvas(); public void init() { setLayout(new BorderLayout()); add("Center",mycanvas); add("North",new Button("button1")); ….; add("East",new Button("button4")); } }
5.6 各种构件的应用实例---Canvas class MyCanvas extends Canvas { 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); }
5.6 各种构件的应用实例---Canvas
5.6 各种构件的应用实例---Canvas 例:按动鼠标改变画布的颜色(CanvasApplet) 有哪些类? Canvas, Button, Color; 哪些方法? init(), action(),swapColor(),paint() color color color 利用输出管理 器按钮和画布 按钮接收 鼠标事件 变换颜色 执行重画
5.6 各种构件的应用实例---Canvas class CanvasApplet extends 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 boolean action(Event evt, Object arg) { if(arg=="Color") mycanvas.swapColor(); return true; }
5.6 各种构件的应用实例---Canvas class MyCanvas extends Canvas { Color color; { 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=Color.red; else if(color==Color.red) color=Color.green; else color=Color.black; repaint(); } 5.6 各种构件的应用实例---Canvas .
5.6 各种构件的应用实例---Frame 5.6.3 Frame类 功能 : 制作一般的独立窗口,它是构件容器 创建 Frame fmInstance=new Frame(); 或 Frame fmInstance= new Frame(“The window for test”); 将其显示到屏幕上 fmInstance.show() 注意:不用add()
5.6 各种构件的应用实例---Frame 常用的方法 dispose,getCursorType,getIconImage, getMenuBar,getTitle,isResizable, setCursor,setIconImage,setMenuBar, setResizable,setTitle 窗口的相关事件: Event.WINDOW_DEICONIFY, _DESTROY _EXPOSE, _ICONIFY, _MOVED
5.6 各种构件的应用实例---Frame 例:创建一个窗口,并用按钮控制它的显示或 隐藏 FrameApplet Frame Window This is CustomFrame window Show window hide window Show window
5.6 各种构件的应用实例---Frame 在applet中action处理Button的事件 button.label is show Frame.show Frame.hide button.label is show button.label is hide
5.6 各种构件的应用实例---Frame . 关闭窗口的事件在窗口类本身处理. 注: 处理窗口中的事件用handelEvent() 为了将字符显示在自定义窗口中,包含输出语句的方法必须在自定义的窗口类中 . Frame Window 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); } }
5.6 各种构件的应用实例---Frame public 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.hide(); button.setLabel("Show window");} else {frame.show();button.setLabel("Hide Window"); return true; 5.6 各种构件的应用实例---Frame
5.6 各种构件的应用实例---Frame class CustomFrame extends Frame { CustomFrame(String title) { super(title);} public boolean handleEvent(Event evt) { switch(evt.id) { case Event.WINDOW_DESTROY: dispose();System.exit(0); default: return super.handleEvent(evt); } } public void paint(Graphics g) { resize(200,100); g.drawString("this is a custom window.",30,30); } 5.6 各种构件的应用实例---Frame
5.6 各种构件的应用实例---Frame 多窗口(FrameApplet\ButtonsFrames.class-f1.bat)
5.6 各种构件的应用实例---Frame 1.一个窗口类创建两个实例 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);} }
5.6 各种构件的应用实例---Frame 3. 任何时候只有一个窗口是活动的(active)的因此不必考虑那个判断是哪一个窗口发生的事件 4.一般的结构 在main()中,只做与窗口有关的事情:创建窗口,显示窗口 在构造方法中,安排窗口中的构件
5.6 各种构件的应用实例---Frame import java.awt.*; class ButtonsInFrames extends Frame { int a1=0,a2=0; public static void main(String args[]) { ButtonsInFrames myframe1=new ButtonsInFrames(); myframe1.setTitle("Button in Frame1"); myframe1.resize(200,200); myframe1.show(); ButtonsInFrames myframe2=new myframe2.setTitle("Button in Frame2"); myframe2.resize(200,200); myframe2.show(); } 5.6 各种构件的应用实例---Frame
5.6 各种构件的应用实例---Frame ButtonsInFrames() { 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.handleEvent(evt);} 5.6 各种构件的应用实例---Frame
5.6 各种构件的应用实例---Frame public boolean action(Event evt, Object arg) { if(evt.target instanceof Button) if(arg=="Button1") a1++; else a2++; repaint(); return true; } public void paint(Graphics g) { g.drawString("button1 "+a1,5,80); g.drawString("button2 "+a2,5,100); }} .
5.6 各种构件的应用实例---练习 与List类有关的事件 public boolean handleEvent(Event evt) Event.LIST_DESELECT, Event.LIST_SELECT 例:(FontDisplay.class---f3.bat) 5.6 各种构件的应用实例---练习 public boolean handleEvent(Event evt) { switch(evt.id){ case Event.WINDOW_DESTROY: dispose(); System.exit(0); default: return super.handleEvent(evt); } add Frame类 Panel类 TextArea类 List arae FontDisplayer FontDisplay! You can input something here. Arial Courier New Times New Roman 18 20 22 24 26 area.setfont(字型, 字体,字号) . handleEvent LIST_SELECT handleEvent WINDOW_DESTROY
5.6 各种构件的应用实例---练习 import java.awt.*; class FontDisplay extends Frame { TextArea FontShower; public static void main(String args[]) { FontDisplay myFrame=new FontDisplay(); myFrame.setTitle("FontDisplayer"); myFrame.resize(450,300); myFrame.show(); } public FontDisplay() { setLayout(new BorderLayout(5,5)); FontShower=new TextArea("Font Display! ”); add("West", new FontPanel(FontShower)); add("Center",FontShower);} 5.6 各种构件的应用实例---练习
5.6 各种构件的应用实例---练习 对窗口来说只有一个事件 public boolean handleEvent(Event evt) { switch(evt.id){ case Event.WINDOW_DESTROY: dispose(); System.exit(0); default: return super.handleEvent(evt); } 对窗口来说只有一个事件
5.6 各种构件的应用实例---练习 在panel中创建两个列表 往列表中加入条目用additem(str) 得到列表选项用getItem 事件处理用用handleEvent,得到两个参数--字型,字号. 对右边的文本区设置属性,利用引用传递. void updateFontShower() { area.setFont(new Font(CurrentFontName, Font.PLAIN, CurrentSize));}} .
5.6 各种构件的应用实例---练习 public boolean handleEvent(Event evt) { switch(evt.id){ case Event.LIST_SELECT: List target=(List)evt.target; String itemName= target.getItem(((Integer)evt.arg).intValue()); if(target==FontSelector) CurrentFontName=itemName; else CurrentSize=Integer.parseInt(itemName);
5.6 各种构件的应用实例---练习 String FontNames[]={"Arial", "Courier New", "Times New Roman"}; List FontSelector=new List(); for (i=0;i<FontNames.length;i++) FontSelector.addItem(FontNames[i]); add(FontSelector); List SizeSelector=new List(); for (i=6;i<64;i+=2) SizeSelector.addItem(String.valueOf(i)); add(SizeSelector);
{ area.setFont(param1,param2,param3) 5.6 各种构件的应用实例---练习 class FontPanel extends Panel { int CurrentSize=20; String CurrentFontName; TextArea area;; List FontSelector,SizeSelector; updateFontShower() { area.setFont(param1,param2,param3)
5.6 各种构件的应用实例---练习 FontPanel(TextArea FS) //把另一个对象做参数 { int i; String FontNames[]={"Arial", "Courier New", "Times New Roman"}; setLayout(new GridLayout(2,1,5,5)); FontSelector=new List(); for (i=0;i<FontNames.length;i++) FontSelector.addItem(FontNames[i]); add(FontSelector); SizeSelector=new List(); for (i=6;i<64;i+=2) SizeSelector.addItem(String.valueOf(i)); add(SizeSelector); area=FS; CurrentFontName=FontNames[0]; updateFontShower(); } 5.6 各种构件的应用实例---练习
5.6 各种构件的应用实例---练习 public boolean handleEvent(Event evt) { switch(evt.id){ case Event.LIST_SELECT: List target=(List)evt.target; String itemName= target.getItem(((Integer)evt.arg).intValue()); if(target==FontSelector) CurrentFontName=itemName; else CurrentSize=Integer.parseInt(itemName); updateFontShower(); return true; default: return super.handleEvent(evt); }} void updateFontShower() { area.setFont(new Font(CurrentFontName, Font.PLAIN, CurrentSize));}} 5.6 各种构件的应用实例---练习
5.6 各种构件的应用实例---menu 5.6.6菜单系统 类MenuBar 菜单容器 类Menu 类MenuItem 非菜单容器 一般菜单 可撕下菜单 帮助菜单 选项#1 菜单容器 选项#2 菜单中的菜单 选项#1 类Menu 选项#2 选项#3 第三层菜单 选项#1 选项#4 类MenuItem 选项#3 选项#2 非菜单容器
5.6 各种构件的应用实例---menu 创建菜单条 mb=new MenuBar(); setMenuBar(mb);(类Frame中的方法) edit file 创建菜单 menu1=new Menu(“file”); menu2=new Menu(“edit) mb.add(menu1);mb.add(menu2);
5.6 各种构件的应用实例---menu 创建菜单项 mi1=new MenuItem(“new”); mi2=new MenuItem(“open”); mi3=new MenuItem(“save”); mi4=new MenuItem(“close”); menu1.add(mi1); menu1.add(mi2); edit File New open Save Close
5.6 各种构件的应用实例---menu 如何处理事件 public boolean action(Event e, Object arg) { if (e.target instanceof MenuItem) { MenuItem selected=(MenuItem)e.trget; tring s=selected.getLabel(); switch(s) { case “new”: ….; case “open”: ….; case “save”: ….; case “close”: ….; }
5.6 各种构件的应用实例---menu 在处理菜单事件 时应该注意的事情是:判断层次 A MenuContainer uplevel;(定义一个菜单容器) MenuItem target=(MenuItem)evt.target;(当前被选中的对象) uplevel=target.getParent(); strMessage=uplevel.getLabel()(得到上一级容器的标签)
5.6 各种构件的应用实例---menu public boolean action(Event evt, Object arg) { String strMessage; if(evt.target instanceof MenuItem){ MenuItem target=(MenuItem)evt.target; MenuContainer uplevel; uplevel=target.getParent(); while(uplevel instanceof Menu) { strMessage=((Menu)uplevel).getLabel()+strMessage; uplevel=((Menu)uplevel).getParent(); } strMessage="you selected"+strMessage; taMessage.appendText(strMessage); return true; } else return false;} 5.6 各种构件的应用实例---menu
5.6 各种构件的应用实例---menu Java1.1处理菜单的方法 两个主要的策略: 1. 让每个菜单项有一个唯一的监听器 2. 将一个大的监听器用于用于所有菜单项
5.6 各种构件的应用实例---menu class Example { class MenuFileOpen implements ActionListener { public void actionPerformed(ActionEvent e) { openFile(e.getActionCommand());} } class MenuFileSave implements ActionListener { saveFile(e.getActionCommand());}
5.6 各种构件的应用实例---menu public void init() { MenuItem OpenItem=new OpenItem.addActionListener (new MenuFileOpen()); MenuItem SaveItem= new MenuItem(“Save…”); SaveItem.addActionListener (new MenuFileSave()); }
5.6 各种构件的应用实例--综合练习 设计用户界面可根据用户选择办理银行业务 Bankapp\Bankapp.class---f2.bat 控制流程
5.6 各种构件的应用实例--综合练习 class Bank { long balance; public Bank() public void deposite(long amount) { if(amount>0.0) {balance+=amount;}} void withdrawal(long amount) { if(amount>0.0 &&amount <= balance) { balance-=amount;} } public long show_balance() { return (long)balance; }
5.6 各种构件的应用实例--综合练习 public class BankDemo { public static void main(String agrs[]) { Bank account1=new Bank(); Bank account2=new Bank(); account1.deposite(100); account2.withdrawal(50); account1.show_balance(); account2.show_balance(); } }
5.6 各种构件的应用实例--综合练习 WelCome to Bank 100 Create account Show nbalance Deposit Withdrawal
5.6 各种构件的应用实例--综合练习 主类Bankapp 辅类Bank 辅类Warningbox (Frame的子类) Bank() 创建账户 main() 定义并显示窗口 Warningbox(String str) 布局安排,显示对话框 显示警告信息 show_balance Bankapp() 布局安排 diposite() action() 关闭对话框 它是模态的 handleEvent() 关闭窗口 withdrawal() action() 根据按钮做处理 不满足Bank要求 满足Bank要求
5.6 各种构件的应用实例--综合练习 public static void main(String args[]) { Bankapp frame=new Bankapp(); frame.setTitle("Bank Application"); frame.resize(200,200); frame.show(); }
5.6 各种构件的应用实例--综合练习 public Bankapp() {setLayout(new GridLayout(6,1)); Label lb=new Label("welcome to Bank",Label.CENTER); tf=new TextField("0",15); add(lb);add(tf); b1=new Button("create account"); add(b1); b2=new Button("show balance"); add(b2); b3=new Button("diposite"); add(b3); b4=new Button("withdrawal"); add(b4); resize(450,100); }
5.6 各种构件的应用实例--综合练习 public boolean handleEvent(Event evt) { switch(evt.id) { case Event.WINDOW_DESTROY: dispose(); System.exit(0); return true; case Event.ACTION_EVENT: return action(evt, evt.arg); default: return super.handleEvent(evt); }
5.6 各种构件的应用实例--综合练习 public boolean action(Event evt,Object arg) {if(evt.target instanceof Button) { String targetLabel=tf.getText(); long amount=Long.valueOf(targetLabel).longValue(); if (arg=="diposite") { if (!haveAccount) {wb=new WarningBox(this,"create a account first!"); wb.show(); } else { if(amount==0) { wb=new WarningBox(this,”need the amount"); else { bank.deposite(amount); tf.setText("0"); }} return true; } return false; 5.6 各种构件的应用实例--综合练习
5.6 各种构件的应用实例--综合练习 public WarningBox(Frame parent,String str) { super(parent,"Warning!",true); Panel panel=new Panel(); panel.setLayout(new GridLayout(2,1)); panel.add(new Label(str,Label.CENTER)); panel.add(new Button("OK")); add(info_panel); } public boolean action(Event evt,Object arg) { if (evt.target instanceof Button) { this.dispose(); return true; return false; 5.6 各种构件的应用实例--综合练习
5.6 各种构件的应用实例--综合练习 class Bank { long balance; public Bank() public void deposite(long amount) { if(amount>0.0) {balance+=amount;}} void withdrawal(long amount) { if(amount>0.0 &&amount <= balance) { balance-=amount;} } public long show_balance() { return (long)balance; } 5.6 各种构件的应用实例--综合练习
5.7 总结 5.8 总结 1 使用AWT构件的应用实例 2 事件的传递 3 外观的管理与控制 了解类及其常用方法 设计好容器层次 2 事件的传递 3 外观的管理与控制 了解类及其常用方法 设计好容器层次 创建输出管理器setLayout 创建类的实例new 定义事件的处理action 加到上一级容器中 add
作业 将文本行的输入加入到文本域中 追加