第九章 GUI(下)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

268第9章GUI(下)9.1常用AWT组件在上一章开始的第一个程序中,我们就用到了按钮(Button),这是最简单的组件之一了,在AWT里还有很多用于GUI设计的组件,我们现在就来了解更多的GUI组件。如图9.1所示描述了AWT中的组件及类层次关系图。图9.19.1.1Component类Java的图形用户界面的最基本组成部分是组件,组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。抽象类Component是所有JavaGUI组件的共同父类。Component类规定了所有GUI组件的基本特性,该类中定义的方法实现了作为一个GUI组件所应具备的基本功能。Java程序要显示的GUI组件必须是抽象类Component或MenuComponent的子类。9.1.2CanvasCanvas代表屏幕上的一块空白的矩形区域,程序能够在这个部件表面绘图,也能够捕PDF文件使用pdfFactoryPro试用版本创建获用户的操作,产生相应的事件,Canvas可以说是具有最基本的和最简单的GUI功能的部件。当我们要设计一种自己定制的具有GUI功能的部件类,我们的这个类就可以继承Canvas,这样,我们的部件类就已经完成了GUI的基本功能,我们只需要在这个基础上增加子类部件所专有的外观和功能的相关代码就行了,我们要想绘制子类部件的外观,我们必须覆盖Canvas的paint方法。我们现在设计一个计时器部件,鼠标在部件上按下时,计时器开始计时,并在部件上显示计时时间,鼠标释放时,计时器停止计时。下面是这个计时器的程序代码,其中涉及到的技巧和知识点,都在前面有过讲解,这里就不作详细解释了。程序清单:TestStopWatch.javaimportjava.awt.*;importjava.awt.event.*;importjava.util.*;importjava.text.SimpleDateFormat;classStopWatchextendsCanvasimplementsRunnable{privatelongstartTime=0;privatelongendTime=0;privatebooleanbStart=false;publicStopWatch(){enableEvents(AWTEvent.MOUSE_EVENT_MASK);setSize(80,30);}protectedvoidprocessMouseEvent(MouseEvente){if(e.getID()==MouseEvent.MOUSE_PRESSED){bStart=true;startTime=endTime=System.currentTimeMillis();repaint();newThread(this).start();}elseif(e.getID()==MouseEvent.MOUSE_RELEASED){bStart=false;repaint();}super.processMouseEvent(e);}publicvoidpaint(Graphicsg){SimpleDateFormatsdf=newSimpleDateFormat(HH:mm:ss);DateelapsedTime=null;PDF文件使用pdfFactoryPro试用版本创建{elapsedTime=sdf.parse(00:00:00);}catch(Exceptione){}elapsedTime.setTime(endTime-startTime+elapsedTime.getTime());Stringdisplay=sdf.format(elapsedTime);g.drawRect(0,0,78,28);g.fill3DRect(2,2,75,25,true);g.setColor(Color.RED);g.drawString(display,10,20);}publicvoidrun(){while(bStart){try{Thread.sleep(500);}catch(Exceptione){e.printStackTrace();}endTime=System.currentTimeMillis();repaint();}}}publicclassTestStopWatch{publicstaticvoidmain(String[]args){Framef=newFrame(StopWatch);f.add(newStopWatch());f.setSize(200,200);f.setVisible(true);f.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}}编译并运行这个程序,你一定要用鼠标按住计时器部件几秒钟,你就能看到我们期望的效果了,如图9.2所示。PDF文件使用pdfFactoryPro试用版本创建如果你想让这个计时器部件尽可能满足更多的应用需求,你还需要增加一些功能,如允许用户设置文本的颜色,文本的大小随部件大小的改变而改变等。9.1.3Checkbox如果你熟悉Windows的应用,对单选按钮和多选按钮一定不会陌生,这两种按钮都有选中和不选两种状态,如图9.3所示。对多选按钮来说,如果有多个这样的按钮,每个按钮之间没有制约关系,可以同时选中其中的多个。而单选按钮则要求有一组按钮,这一组按钮中同时只能有一个为选中状态。Java里提供的这个Checkbox类来建立单选按钮和多选按钮,Checkbox的使用很容易,如果要创建多选按钮,我们只要使用publicCheckbox(Stringlabel,booleanstate)这个构造函数来创建Checkbox对象就行了,创建多选按钮要用到两个参数,前一个是选框旁边的说明文字,后一个参数决定选框是否默认被选定。因为创建单选按单钮需要一组按钮,所以在创建单选按钮时,我们还需要指定这个按钮所属于的组,使用publicCheckbox(Stringlabel,booleanstate,CheckboxGroupgroup)这个构造函数创建的就是单选按钮。其中,CheckboxGroup类对象指定了这个单选按钮所属于的组。对一般的程序来说,需要处理单选按钮和多选按钮的ItemEvent事件,从而获得用户选择的结果。处理ItemEvent事件的监听器接口为ItemListener,其中只有一个itemStateChanged方法,显然,ItemEvent是一种语义事件。下面是一段创建多选按钮和单选按钮以及相关事件处理的程序代码:程序清单:TestCheckbox.javaimportjava.awt.*;importjava.awt.event.*;publicclassTestCheckbox{Checkboxcb1=newCheckbox(你喜欢我吗?,true);CheckboxGroupcbg=newCheckboxGroup();Checkboxcb2=newCheckbox(喜欢,cbg,true);Checkboxcb3=newCheckbox(不喜欢,cbg,false);publicvoidinit(){Framef=newFrame(TestCheckBox);PDF文件使用pdfFactoryPro试用版本创建创建FlowLayout布局管理器,关于布局管理器,本章后面有专门的讲解,看不明白//的读者暂时可以不去下面两句代码的作用。FlowLayoutfl=newFlowLayout();f.setLayout(fl);f.add(cb1);f.add(cb2);f.add(cb3);cb1.addItemListener(newCbItemListener());cb2.addItemListener(newCbItemListener());cb3.addItemListener(newCbItemListener());f.setBounds(0,0,300,100);f.setVisible(true);f.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}classCbItemListenerimplementsItemListener{publicvoiditemStateChanged(ItemEvente){Checkboxcb=(Checkbox)e.getItemSelectable();if(cb.getLabel().equals(你喜欢我吗?)){if(cb.getState()==true)System.out.println(我很高兴);elseSystem.out.println(我很伤心);}/*elseif(cb.getLabel().equals(喜欢)){if(e.getStateChange()==ItemEvent.SELECTED)System.out.println(我也喜欢你);elseSystem.out.println(我也不喜欢你);}*/else{Checkboxcbx=cbg.getSelectedCheckbox();if(cbx!=null)PDF文件使用pdfFactoryPro试用版本创建(cbx.getLabel());}}}publicstaticvoidmain(String[]args){newTestCheckbox().init();}}程序运行效果如图9.3所示:图9.3如果我们用注释的程序代码来处理单选按钮,需要为每一个单选按钮都编写一段这样的代码,如果按钮的个数较多,程序就比较臃肿,但从这段注释代码中,读者可以了解到对同一问题的多种处理方式,也可以在正好有这方面的需要时参考。如果我们不想直接处理这些单选按钮的事件,而是在别的部件的事件处理代码中收集这些单选按钮的选择结果。譬如,我们经常在最后单击ok按钮的事件中再去收集设置对话框上的所有部件的设置结果,我们使用类似程序中else部分的代码,就是一个不错的方法。9.1.4ChoiceChoice类用来制作用于单选的下拉列表,用起来也比较容易,来看这段程序:程序清单:TestChoice.javaimportjava.awt.*;importjava.awt.event.*;publicclassTestChoice{Choicech=newChoice();//创建Choice对象TestChoice(){ch.add(choice1);//用add方法向列表里加入选项ch.add(choice2);//用add方法向列表里加入选项ch.add(choice3);//用add方法向列表里加入选项FlowLayoutfl=newFlowLayout();Framef=newFrame(TestChoice);f.setLayout(fl);f.add(ch);//把列表加入到窗口f.setBounds(0,0,200,100);f.setVisible(true);f.addWindowListener(newWindowAdapter()PDF文件使用pdfFactoryPro试用版本创建{publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicstat

1 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功