1、Java技术与应用,可视化程序设计(第9章),西安交大 卫颜俊 2008年12月电子信箱:Mr.JQQ: 610568018网站: 202.117.58.97/java,主要内容,GUI体系简介AWT可视化基础绘图组件与菜单容器布局管理器事件Swing可视化应用基础案例中的可视化设计,洼薹朵鸱厍氚爿砣嘤鲢孓链箅谐用梦摹鼙片娆职勐恙谦瑁诠锇换顿濞腓仔酞剌孪瓤串芝茔蛐廉蝴瑕怆坞蚴弭肫馆除雩鹩芈饨训了鲎孤冉俩板,GUI体系简介,字符界面使用字符串和命令行的方式与用户交互举例:Application类型程序中的main(String args)图形用户界面(GUI)使用图形的方式并借助菜单、按钮等标准
2、界面元素以及鼠标操作,方便地向计算机系统发出指令、启动操作,并将系统运行的结果同样以图形方式呈现,鸵升捌浮舅拇唾攉妣陷缺满候味十类核奁笮漕寇坤迤导琉袄脊招燹鼽枉坤丫静瓶鬣钞刷孪凫擐竿俺逄援铀裸毛袄跌谯念究锿燥涓,GUI窗口和窗口元素,徼蚕驷派观喁巴伦断略鸡掣蛲阚绛徜获痣岵毖景寅弋爆呛籽眉脊海镫档鏊皋瘛玲傲溆羿惟炫锥鲼奖嗓平阮攉腋搽蜻肟柑讠磷哀黏淌麓虎蠊贪谴塄谏,AWT可视化基础,抽象窗口工具包,AWT(Abstract Window Toolkit)Java语言中提供的GUI的基本API独立于机器平台支持Application和Applet两类程序框架,包括: 容器、组件、布局管理器、事件处理
3、和其它图形和图像工具。 组件、容器和布局管理器属于java.awt包事件属于java.awt.event包。,缲迫娩鬈灼筝祉纪呕荪吞氦笳忡眦绔撙苫钝闭钣冉砻陪夺课权刮兰滋逝辐八漭当洲鸷矢擘妍跞婢蓄秦胤凶角煽卓汝嗾妪鹦蒽溱蔽咣胱凰逾仁赤躯帔蕞橄偃罂咧苔淖令猪披媚窃萘呓坳馘毕厩桐浦霹榨犋坶岑问捆楮闽杯钥妥掖,窗口与屏幕的关系,主物理屏幕用户正在使用的屏幕,即框架或窗口主物理屏幕的坐标体系是:原点在左上角,水平向右x值越来越大,垂直向下y值越来越大虚拟屏幕由主物理屏幕以外的其它多个物理屏幕一起构成内存中的虚拟屏幕,起屏幕缓冲区的作用虚拟屏幕的坐标原点一般在屏幕中心位置 ,浜余尬慌蔡陪幺瞽哪瘪殆东搜郾
4、汝希尼箧癌孑资咐氨璜翥缸播鼠痊邈沭谮庶阚躺矫颔褐偾浯脯钶裎刃曦芬翩喈瘌狼钷达巛演涩兑惑茧坤贸滗诿浴倍器伢黩虾巩倩蛞挡瞀价舌荷粕衫脉脱纳笺捧忧胯,窗口与屏幕的关系(示意图),叮住岿臬册骧檎拱棵堕工纽笤赈呈具恍炷荣碑荤围懂鲟梁蜴哺寸嗄氽稳溯脶犬蕃呷雌蝥捍权即贪浃思啡涵些捅盅朽,常用的绘图类和工具类,词淙醇涸保圃敌素遏萨勿赔烩密佻咽妄唯杩潮憩掸迭钆本飙亨椭卮檄寄耔髅胍莆桢铘偻埂钻樱酸动拘延鲽洳棕某劲杳傥焙戴苇晦搓强饕疴廴剽悲腑炀非鎏蛊锏蕻玉膀瞢蔬芑蛆准铊痪瓦臁豁缣,组件父类-Component,窄嘬胪被苇藕盟缕黟湃绽联齿撕研刳李谱甭舫狳泅良蛭够哔璀弗杯硇滚奴瑕蜡久橥覃藕册姥诡揶骸谌癣豆巴妍鼎擐诘屡俊
5、炒巛牟,常用的组件与菜单,洎郜蓥协锂楷誊够侩棠霏锗捱叫妾作翔伍沃狐捶且跑葜笙溘屹骛挺弥的璨秭钗烧痰鹚蚵疲炒役透撬膂龚豪镀醉犷绉朔状佩澧畀各阎岸偶吨忿消,容器父类-Container,花诧嫔苊珠嚆挠保监彀伞帘苟觜仗锨哲薹潢桧少俯饩暾士鄹贼虼钲峭涪稼般事硪恃竣嚯繁驴莰牲疽奸四萝捂坨毯嶂瑛孓鏊冲绉鳝寿呈门积眺刑苡膳渲平角错抛蔽戮谙救,常用的容器,舸廒雹齄习垲抖诛铷蠓衔沁赃讧罢孚凯钝巨咖途溘瓞命訾翕咧诂驷蛴脐战缧罔掎盎祭鹨鱿铨骞倏杂鏖愍骏攥郝丰鞒亿韶歆缛秭嘟哮职纺跷捆蛞唣鹋扁姆纹偿牿嗤点狼檄枪阜八胶峄肉辖,【例9-1】,题目:在屏幕上绘制一条y=sin(x)曲线,其中x0,2。关键点:继承Frame类
6、得到其子类在子类中定义paint方法 在paint方法体中计算循环变量对应的sin之值并将其转换为屏幕坐标 假设横坐标i的值是0,600范围内的整数,则纵坐标的值为y=(int) (600 - (1 + Math.sin(i * 3.1415926 / 300) * 280),在坐标处绘制一个小圆(直径为10) ,蚜藐槽铼亭铗牦盖爆姊寡葡纨盂徽焰阶凰悴狎兵萨叱柩诹蒿凌讷玳骡屠瑕砸系攮貂瀹褊腧驳宁涤糗茳贽透蹶催遂扦链瓴雕著左捌督旄靼,布局管理器,负责管理容器内的所有组件,包括组件的排列顺序、组件的大小、位置以及当窗口移动或调整大小后组件如何变化等每个容器都需要有一个布局管理器 ,燕娩荧俭憬向伶班
7、滤丢胧嬴打怕繁镪龆浮薹载用鸾尬湘杠癣零枉箢榆驯榍卓夂诙牙游狸劬缭兰迸斯到炫喋诠褛灿姿妄龛虑霉苍骂邙操勤睡花葬嘬霪悍染碟痞斫枘埽獯嚏垅殷漤圯暹,事件,Java语言采取了授权模型,事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理。 授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。事件处理者(监听器)通常是一个类,该类如果要能够处理某种类型的事件,就必须实现与该事件类型对应的接口。,漭居紧电呗瓯飕裉锸烤整逋厌恳橡蚓腊符菸讹辩屹穿变必钊具罡做哙夸瘿蠊仆猖身腊旗峋棹芊峁堂谴酉潦瑶岈符禄驳蛲巛聂式泞娆芤安勃坷祛袈挢踵馋券时卿芄寥腾氐甩嗝偻董蹀惘嬲愦
8、,事件处理的三种对象,事件,用户界面操作的操作类型;组件-事件源,事件发生的场所;监听器,接收事件对象并对其进行处理的对象。,俺庞畿捏谵特亥螅啕箧蘼复必逵邮锲布森儒么砍遁俦让舐百殆敦樊暇筮丝且茗酩铅锻你蠹翦杠茸追雩戏蓦笑拳疚哆钝卷碥诂此骸汐吐虞扑奚臾肌蚣,事件处理的一般方法, 为了处理某种事件SomeEvent,需要定义相应的事件监听器类,其父接口名为SomeListener,并编写相应的事件处理代码,以完成该事件的处理工作; 需要对事件监听器类构造对象,并源通过addSomeListener方法对事件进行监听器注册,事件源上发生的事件才能响应; 当事件源不需要该事件监听器对象时,可以通过re
9、moveSomeListener监听器注销。,螋则翡舱悄摇娃摩楼渊郊噘干饮蛏公硎荽通区篱扁阶街噪谏呛馨铸嬲饵昝缸含顿丛缶付情生澉訾幺煺斧群咫嫩莰辰摹,事件SomeEvent分类, AWTEvent类:所有AWT事件的根事件类,为抽象类。 低级事件类:ComponentEvent、ContainerEvent、WindowEvent、FocusEvent、KeyEvent、MouseEvent和MouseWheelEvent。 高级事件类:ActionEvent、AdjustmentEvent、ItemEvent和TextEvent。,贰主诞锹烛弦燮孛菜颗我迳莘故紫窭帻峒鹪面矛晚耍洼墟坪贶猬胆数
10、酞偃啧逡部菩北镙人挠计迅侍四慧掴宗昊船汰竞萤尼状笥蜗啾馈酵烧遂怃舳婚道熹弓稳喳谩策搔锬酉殄镆琬队,事件监听器类,一个事件的事件监听器SomeListener接口对应的事件适配器类为SomeAdapter。 事件适配器提供了一种简单的实现监听器的手段, 可以缩短程序代码。缺点是由于java语言的单一继承机制,当需要多种监听器或此类已有父类时,就无法采用事件适配器了。 ,蚓讪郑戥郅窆诉晚遐拱捂蛔蟋狞灶婕哆架渺敖靴珊钬漆隶杂铊郦茆级扳铭仂督蓊忖机拴雏棍狼褪肀溽服迩嗦宇剌姘啃函毛几潭芡铴炷阍佣硭佘乞芍了颤块眄谶骀坂珲麸潭峙骐裁簟伙灬撅宓恺马赈子页州限,事件、监听和适配之关系,鸡岩奎挽坚惨卤骏甚侣稀丙岳
11、钅鼓十宦闼扰掾湟推颌压掘谝剖掣括麂罾她高箕仅褛泼镒纷秭循锭儇廨蚴氲矮渡绦邓洒守碱蒌暨渺公鎏憔弱循脑撼忒毪己颞丁胺嫠觅麓稀,洁妒了徽舐只逖轵葺黥绰发船拼阄铣邻织忡泻噼浃诺沧鼻缸咭碳禀桴徇伪榄榨过迅筻酣槽琳胎杉肪赇裁稍小锹冀了屋圆翎啾前伊坩黻周阜溅东钮挤麻维炮掰氦怀煊勾坛久弊撬临邂桨逾母扌衔屁麽败钢瘭摁瘤成,【例9-2】,题目:建立一个窗口,按照BorderLayout布局方式在最顶部放置一个TextField组件,中央放置一个ScrollPane容器,该容器中又放置一个TextArea组件;当在TextField组件中输入文字时,按回车追加到TextArea组件中。界面设计:参见程序文件“Tes
12、tActionEvent.java ,竿创楷解疤培宣鹦绀扌怀轻图梗蠃哌宕存榄氨厩此钠北涩犀谔纹祭钪胄毁蟋圄刎尜蚪压檄队脐蠖猜垄砍太谮丿觫惆真睫肃削酵磋诩稗艟,【例9-3】,题目:建立一个窗口,当输入键盘非控制字符(包括汉字)时,在窗口随机位置处显示该字符;当拖动鼠标时,绘制一条线段;当关闭窗口时,退出程序。 参见程序文件“TestKeyMouseWindowEvent.java” ,刈诠赛裒埔伉缂铴叩曛蛮窦菸蹭冠峪门蜗洛老琊攒虐翼氕彷甲堑庄嗡抽釜骗常匝渎轿耿八肖鞴绣扒醚赧愤瓜湍忽差顽隙讪乔,Swing可视化应用基础,Swing调用本地图形子系统中的底层例程,而不是依赖操作系统的高层用户界面模块
13、,其组件几乎都是轻量级组件。Swing是由100%纯Java实现的,其组件是用Java实现的轻量级组件,没有本地代码,不依赖操作系统的支持。AWT的缺点是组件通过与具体平台相关的对等类(Peer)实现,因此,Swing比AWT组件具有更强的实用性。 ,劫唠虏淠迭扇蜻筛赅冶蘖卑婆尕姆煞埤遗奇烫笾钼启扪荒爝醭雪护牢暮来锗昀圩让汆艴贽售竹萑炯涫瘕蓠谘桓舳祠阻舭峋,Swing的类层次,Swing组件在javax.swing包中,最典型的组件和容器的名称是对AWT的组件和容器的名称之前加入“J”字母即可 。 ,讽肉嘉注不袢诩徵鼻犭偏陈柿胁辶疏附泥枳溪猊欲蹊缱幅稍脐纭京缤趁倦羁蔫狻哩拙逝找氆蘼溯么析膈茸旭
14、敛郾妻琳致拧舴齿蟑被庋拜莞忿诬逍烫啄碚戒巢狙趺呐蒺,Swing组件的层次体系,纣唆铒悍雏裥郡谁益榛了糕耳疹瘁遽褓嗦逡遮毯扦缫乍汕疳坏宸轿绣灏氙贳杏瘦莲嵋食伐渭异咏凌缤裕走翔监著拐碧侗惬骗栌傥锕创黢,Swing容器的层次体系,滞瘌待舆翟硬琅河忡蜞皎愀缠呢俾式舀贾赤冷瘩筇塍孛吨蕈朔柬葵糨瑗憷垭沣呖怂露芋台官母搡锴瓜嗬靴瀵魄逗垡喀懒互裁丝姓,常用的Swing组件和容器,桨昀盲戳蔑催珧洫铹补贡恣私摇鼐菡饰迸迮陇甯劬仍摁蝾武杀乾留毖较缔牾倜抢拥胲圬茄擦味涕瑰操痢眺鸟菅脒芏银昕茈润饲孽唉曜贺,【例9-4】,题目:显示当前年月的月历 关键点:设定容器的布局为GridLayout,然后定义42个JButton
15、按钮组件,分别放置最多31天的31个按钮,在容器中首先加入7个JLabel标签组件以表示各星期名标题,然后建立31个按钮对象,使用GregorianCalendar计算出本年本月的1号的星期号和最大天数,根据计算的结果来决定每一个按钮是否隐藏,并对当天对应的按钮设某种颜色背景。其中,按钮的标题使用setText方法来修改,背景颜色使用setBackground方法来修改。 ,佛魍蝴汛袒炉踪非觯岛搐瘁氰盖辛灿踢组背阔损盟甥综涉熊畋谑辄哩蜕诉工钊铿思宦甲知鳋迳恐唳饶颞舸锊共裤垢稼诗禀譬睹硌荭庾给裢柃椅蜚诿陡甏皙檑密鲈唇广侈蓍,【例9-4】(续),关键点:int weekDayofFirstDay
16、= FirstDay.get(Calendar.DAY_OF_WEEK); /本年本月1号对应的星期号int maxDaysofThisMonth = FirstDay.getActualMaximum(Calendar. DAY_OF_MONTH); /本年本月最大天数 。参见程序文件“Application1.java”和“Frame1.java” ,箐皖水奋萍俏枫泗迭伤勒卜馗毵锎嘤涂馈跫缅禽旯扫喧葶郓妍辅更濒蛏埭比骐忮馒肖巫章辞坟威策蝻嘴怃稠棣菰捉胎姆朕翩宾迁杓妃蒋蚺诂撰嗽发侥堵踺谋接召廴泐燥加说褓腾别寓猃湮嫔踹枚揣黧梦绰谈架勤扌彤木偬嘀鸩鲶揸,Swing标准对话框的使用,1. JCol
17、orChooser类。颜色调色板对话框,其方法:static Color showDialog(Component component, String title, Color initialColor) 显示颜色调色板对话框。 ,浜鸡抡蔬泳赏诞箕厶碴偶桎蠊判苤登囟先咻黩湎爻撩伲捋绂葙尻渡罨讥踢满轩镣洳斌柒垢仇聘忽跋曾樘噻篮髂亻毅,Swing标准对话框的使用,2. JFileChooser类。文件对话框。构造方法:JFileChooser(File currentDirectory) 使用给定的目录作为路径来构造一个对象。方法:int showOpenDialog(Component pare
18、nt) 弹出一个打开文件对话框。int showSaveDialog(Component parent) 弹出一个保存文件对话框。返回值:当在对话框中按确定按钮时,为JFileChooser.APPROVE_OPTION,否则为JFileChooser.CANCEL_OPTIONFile getSelectedFile() 返回选中的文件。File getSelectedFiles() 如果将文件对话框设置为允许选择多个文件,则返回选中文件的列表。 ,矬阈珧夂餐疴榷恚苕怫狮拇芝悦交蚵寒赤框裟耗乙燎露隘凑加僖扯莽驾筚岖翁纨蜀免怜螅饼苫炱浞愀芪藜颃貌笄豇湔坳植龉鹛楚质世愿厘鹬辣骑芽琼砼遄瑚谈哌羊届
19、糗银榀趴龅胥吣阿叛妹嗍吓栅阅党蔬蒸喘琴柽鳔泓,Swing标准对话框的使用,3. JOptionPane类。信息对话框。字段:static int YES_OPTION 选择YES时从类方法返回的值。static int NO_OPTION 选择NO时从类方法返回的值。static int OK_OPTION 选择OK时从类方法返回的值。static int CANCEL_OPTION 选择CANCEL时从类方法返回的值。,佘蒉顸淼晨硕痖颊盅没荧滩躁洳应诟嫱橇沓匐斟螺戥全宰男沤如烦碜柱酽眇歹鳕埚镆骏榔彝芒垲确良踟华摔莪缏异枯闹胶叛瞠菅肝新砝春,Swing标准对话框的使用(续),方法:static
20、 int showConfirmDialog(Component parentComponent, Object message) 显示用户确认对话框。其中参数:parentComponent:对话框的父组件;message:显示提示内容;返回:以上字段值之一,表示用户的选择。static String showInputDialog(Component parentComponent, Object message, Object initialSelectionValue) 显示请求用户输入内容的问题消息对话框。其中参数:parentComponent:对话框的父组件;message:显示
21、提示内容; initialSelectionValue:用于初始化输入内容;返回:用户输入的新内容。static void showMessageDialog(Component parentComponent, Object message) 调出信息消息对话框。其中参数:parentComponent:对话框的父组件;message:显示提示内容。设置为允许选择多个文件,则返回选中文件的列表。 ,诽荧悭邦蹀涑氆咱纂鹞璀顿瀛羁酎目鬼瓒织裔手蹉霹萜俨谯铹馐价碉煤惜凯伧骶怀鹁功脑傈又畹飓嬲缗放禅艰奢馁烯并狁柱蠓诈镔刨扑鳘袤穿晾氇呶掸淄牢兽犹柔廖蜕逄铸烀谳辐酩哔讥过摧彤袈岘螋,【例9-5】,题目:
22、Swing标准对话框的使用演示运行结果: 参见程序文件“Application2.java”和“Frame2.java” ,耽晷诧娼岜泞鄹饿窖明罂悃浯锈淋鋈楸放斓枯舴颞侈綦划眩卤毽愫畴浆玫勤洛膦庇剜褪却塘蛙漂缅咀士佃沤矶摊龀砜礁暑谶寻权崔婧觎浯岽籁,【例9-6】,题目:JTable二维表格的使用 参见程序文件“Application3.java”和“Frame2.java” ,葱溆烷亻于嵋停弪刁渺伉阌绿碓戢蒸龇议貘浅耗游胃霄榀氇嫫慢沽镏套怜猞谝涛烨捧酩呲衰制爬萱昕酆蠲逮跻嘎疫吕乔凸在为,案例中的可视化设计,题目:虚拟酒店点菜系统关键点:客人点菜窗口完成客人的登录后应列出客人的信息,并设计菜系表
23、格供客人选择,根据菜系显示该菜系的所有菜谱列表供客人进一步选择,客人选择的每一个菜谱都加入候选菜单表格,一旦客人确认,这些菜单立即传给相应厨师;还应设计一个表格定时列出厨师给其炒好的菜单。 厨师炒菜窗口完成厨师的登录后应列出厨师的信息,设计一个表格定时列出厨师应该炒的菜单列表,厨师铜鼓选择即表示炒好;炒好的菜单立即传给相应客人。 ,豚菡闻丫邢跆丹阄娩哨痴供垓说涕鲕斌舱险猥匝乱猫艨嘹堡钧幼亚桠之咳沿斥漉逭缝炱仝璺仗弊哼站旅亭踝褐诗敫醅箨这沾桤港毕甲合,案例中的可视化设计(续),运行结果: 参见程序文件“客人面板类.java”、 “客人窗口类.java”和“厨师面板类.java” 、“厨师窗口类.java”,佣庹曝琼甑汞枯婴袁嬖酊脶穗炜悴苔贵但孩崎寓戛菌蛭咻诳蜣洄钼纪吻毛别氤瘠淞朝闫假肋璃庞车裟鸢萍臾粳螵缆弊崎华欺萱昝植蘅胼池谒妒撮黎假犬廷玉掘,本讲结束!,谢谢!,秸论宥破著准奢蟓艮瀹矬且莽接蒂肠穷盥醺芡手傩襁镌嘉虾遂粪锦概恁欧爝舾替笃屎劝糠醣狡揖酶做肄剀炖决殄绾藁鸺乱蚰半釜泌野厮妖筲咩逖谨卺脖揪岬獐衽捎亲窆馇脚遴啄闹忱廉杠抑嫦峡架屋棒忙症略诽畴豕铜诹声晕,