资源描述
秦学礼,*,JAVA,程序设计实用教程,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,2024/10/1,秦学礼,1,JAVA,程序设计实用教程(,8,),秦学礼,2,2024/10/1,第,8,章 窗口、菜单和对话框,8.1,窗口及事件,8.2,菜单,8.3,对话框,秦学礼,3,2024/10/1,8.1,窗口及事件,窗口的构造方法:,Frame();,创建一个没有标题的窗口。,Frame(String title);,创建一个标题为,title,的窗口。,常用方法:,setBackground(Color c);,根据参数,c,设置窗口的底色。,setVisible(boolean b);,根据参数,b,设置窗口是否可见,值为,true(,可见,),或者,false(,不可见,),。,pack();,用紧凑方式显示窗口。如果不用该方法,窗口初始出现时看不到窗口中的组件,当调整窗口大小时才能看到这些组件。,setTitle(String title);,设置窗口的标题是,title,。,getTitle();,获得窗口的标题。,setResizable(boolean b);,设置当前窗口是否可调整大小(默认是可调整),值为,true(,可调整,),或者,false(,不可调整,),。,setSize(w,h);,设置窗口的大小。,setBounds(x,y,w,h);,设置窗口的坐标和大小。,秦学礼,4,2024/10/1,上一章已经介绍了窗口的事件(,WindowEvent,)中的,windowClosing,事件是关闭窗口的,其实总共有,7,个窗口事件:,windowActivated();,窗口被激活。,windowDeactivated();,窗口失活(其他窗口激活)。,windowClosed();,窗口已被关闭。,windowClosing();,窗口正被关闭。,windowOpened();,窗口已被打开。,windowIconified();,窗口被最小化为图标。,windowDeiconified();,窗口由图标恢复。,秦学礼,5,2024/10/1,例,8.1,一个,使用窗口事件的简单,例子,。运行结果如图,8.1,所示。,算法分析:,(1),定义一个窗口类。,(2),添加窗口的打开、关闭和激活等,7,个事件处理方法。,源程序,(,javajcch08 windowevent.java,),程序分析:,在本例中,把事件监听者注册给,WinLis,类处理。,windowClosing(),事件中使用了,dispose(),方法,用来释放窗口和其上的组件所占用的资源。然后关闭窗口。,在例,8.1,里的,7,个窗口事件并不总是全部使用,有时候只使用其中几个事件。比如说例,8.2,。,秦学礼,6,2024/10/1,例,8.2,另外,一个,使用部分窗口事件的,例子,。运行结果如图,8.2,所示。,算法分析:,(1),定义一个窗口类。,(2),添加窗口事件的其中四个事件。,源程序(,javajcch08 WindowListener_Example.java,),程序分析:,请注意,本例中只重写了,4,个事件,另外三个事件,windowOpened(),、,windowIconified(),和,windowDeiconified(),并没有重写和使用,但是在程序中还是一定要写出来,不然程序就会出错。但是如果使用的是,WindowAdapter,类,不使用的事件就不需要写出来了。,秦学礼,7,2024/10/1,例,8.3,一个,使用,WindowAdapter,类的窗口事件,例子,。运行结果仍如图,8.2,所示。,算法分析:,(1),定义一个窗口类。,(2),添加,windowActivated,等,4,个窗口事件。,源程序(,javajcch08 WindowAdapter_Example.java,),程序分析:,请注意比较例,8.3,和例,8.2,程序里的区别,它们的运行结果是一样的,但是所使用的事件类是不一样的,例,8.3,使用的是,WindowAdapte,类,没有使用的,3,个窗口事件就不需要写出来。这里使用的是,extends,关键字。,秦学礼,8,2024/10/1,8.2,菜单,菜单是图形用户界面的重要组成部分,它是由菜单条,(MenuBar),、菜单,(Menu),、菜单项(,MenuItem,)和复选菜单项,(CheckboxMenuItem,)等组成的。它们的继承关系如图,8.3,所示。,图,8.3,菜单栏类的继承关系,秦学礼,9,2024/10/1,8.2.1,为窗口加入菜单和定义二级菜单,菜单与其他组件不同,无法直接添加到容器的某一位置,也无法用布局管理器对其加以控制,它由以下概念支撑:,1,菜单条,(MenuBar),Java.awt,包中的,MenuBar,类是负责创建菜单条,即,MenuBar,类的一个实例就是一个菜单条。菜单条只能添加到,Frame,中(用,setMenuBar(),),做为摆放菜单的容器。,创建菜单条:,MenuBar MenuBar1=new MenuBar(),。,添加创建菜单条到,Frame,中:,setMenuBar(MenuBar1),。,秦学礼,10,2024/10/1,2,菜单,(Menu),Menu,类负责创建菜单,即,Menu,类的一个实例就是一个菜单。菜单必须添加到菜单条中。,创建菜单:,Menu Menu1=new Menu(,文件,),。,添加到菜单条中:,menubar.add(Menu1),。,3,菜单项,(MenuItem),MenuItem,类是负责创建菜单项的,即,MenuItem,类的一个实例就是一个菜单项。菜单项必须添加到菜单中。,创建菜单项:,MenuItem item1=new MenuItem(,新建,),。,添加到菜单中:,menu1.add(item1),。,秦学礼,11,2024/10/1,4,分隔线,当希望在菜单项之间添加一条横向的分隔线,把菜单项分为几组时,可以添加分隔线。,创建分隔线,menu1.addSeparator(),或者,menu1.add(-),。,5,检测盒菜单子项,这种菜单与复选框一样有,“,选中,”,和,“,未选中,”,两种状态,处于,“,选中,”,状态的检测盒菜单子项前面有一个小对号。,创建检测盒菜单子项:,CheckboxMenuItem Checkbox=new CheckboxMenuItem( );,添加到菜单中:,menu1.add(Checkbox),。,秦学礼,12,2024/10/1,例,8.4,一个,窗口加入菜单及其事件的简单,例子,。运行结果如图,8.4,所示。,算法分析:,(1),定义一个窗口类并声明监听者。,(2),添加菜单的,actionPerformed(),事件处理方法。,源程序,(,javajcch08 Menu_Example.java,),:,秦学礼,13,2024/10/1,例,8.5,一个,窗口加入二级菜单和菜单的事件处理的,例子,使用数组添加菜单,。运行结果如图,8.5,所示。,算法分析:,(1),定义一个窗口类并声明监听者。,(2),使用数组作为添加项,然后用,For,循环添加二级菜单,(3),给菜单添加,itemStateChanged(),事件处理方法。,源程序,(,javajcch08 MenuItem_Example.java,),程序分析:,需要注意的是,例,8.5,中使用的二级菜单是通过数组来添加的,对于组件比较多的时候,使用这种方式添加较方便。而对于,“,Bold,”,这个菜单项是使用的,CheckboxMenuItem,。,秦学礼,14,2024/10/1,8.2.3,弹出式菜单,弹出式菜单是附着在一个组件或者容器上,一般当单击鼠标右键时,才会出现。弹出式菜单也有子菜单。,创建弹出式菜单:,PopupMenu pm=new PopupMenu();,MenuItem mi=new MenuItem(Copy);,pm.add(mi);,然后把弹出式菜单附着在一个组件或容器上:,TextArea ta=new TexArea();,ta.add(pm);,当在文本区单击鼠标右键时,触发一个鼠标事件,处理方法是,isPopupMenu(),方法,有三个参数,第一个是含有坐标系的对象,当值为,this,时表示当前窗口,后两个参数是鼠标单击是的,x,和,y,位置。,秦学礼,15,2024/10/1,例,8.6,一个在,窗口中加入弹出式菜单和其事件处理的,例子,。运行结果如图,8.6,所示。,算法分析:,(1),定义一个窗口类并声明监听者,ActionListener,和,MouseListener,。,(2),窗口加入弹出式菜单及其,actionPerformed(),和,actionPerformed(),事件处理方法。,源程序,(,javajcch08 popmenu.java,),秦学礼,16,2024/10/1,程序分析:,在本例中,选择,Copy,选项时,,getActionCommand(),方法取得弹出式菜单的菜单项的名称为,Copy,,文本区上显示,You are chose Copy,。使用了,ActionEvent,和,MouseEvent,事件类。因此声明了,ActionListener,和,MouseListener,两个接口,文本区添加了,MouseListener,,弹出式菜单添加了,ActionListener,,,isPopupTrigger(),方法设置了弹出式菜单的显示坐标。由于使用的是,MouseListener,,所以每一个鼠标事件都要写出来。,秦学礼,17,2024/10/1,8.3,对话框,对话框(,Dialog,)在,GUI,中是经常使用的窗口对象,它和窗口一样有标题、边框、关闭按钮,它是独立的容器,不能被其他的容器包容,不能作为最外层的容器,也不能包含菜单条。它是隶属于一个窗口并由这个窗口负责弹出。,8.3.1 Dialog,类,8.3.2 FileDialog,类,秦学礼,18,2024/10/1,8.3.1 Dialog,类,对话框是由,Dialog,类实现的,它的继承关系如图,8.7,所示。,图,8.7 Dialog,类的继承关系,秦学礼,19,2024/10/1,Dialog,类的构造方法:,Dialog(Dialog owner);,创建一个对话框,指定其拥有者为对话框,owner,。,Dialog(Dialog owner,String title);,创建一个拥有者为对话框,owner,的对话框,标题为,title,。,Dialog(Dialog owner,String title,Boolean modal);,创建一个拥有者为对话框,owner,、标题为,title,的对话框,设置是否为模式对话框,在该窗口被关闭之前,其他窗口无法接受任何形式的输入,当,modal,值为,true,时是模式对话框,为,false,时是无模式对话框。,Dialog(Frame owner);,创建一个对话框,指定其拥有者为窗口,owner,。,秦学礼,20,2024/10/1,Dialog(Frame owner, Boolean modal);,创建一个拥有者为窗口,owner,的对话框,并设置是否为模式对话框。,Dialog(Frame owner,String title);,创建一个拥有者为窗口,owner,的对话框,标题为,title,。,Dialog(Frame owner,String title,Boolean modal);,创建一个拥有者为窗口,owner,、标题为,title,的对话框,设置是否为模式对话框。,秦学礼,21,2024/10/1,常用方法:,void dispose();,销毁对话框对象,释放掉对话框占用的内存。,String getTitle();,获取对话框标题。,void hide();,隐藏对话框。,boolean isModal();,测试对话框是否为模式对话框。,boolean isResizable();,测试对话框是否可以改变大小。,void setModal();,设置对话框为模式对话框。,void setResizable(boolean resizable);,设置对话框是否可以改变大小。,void setTitle(String title);,设置对话框的标题。,void show();,显示对话框。,秦学礼,22,2024/10/1,例,8.7,一个使用模式,对话框来关闭窗口的,例子,。运行结果如图,8.8,所示。,算法分析:,(1),定义一个窗口类并声明监听者。,(2),在窗口加入模式对话框。,(3),在对话框中加入按钮和标签。,(4),添加对话框的,actionPerformed(),事件处理方法。,源程序(,javajcch08 Dialog_Example.java,),:,程序分析:,需要注意的是,在创建对话框的时候,本例创建的是模式对话框。因此,只有在处理完对话框的操作后,才能返回到窗口。,秦学礼,23,2024/10/1,8.3.2 FileDialog,类,FileDialog,类(文件对话框类)是继承自,Dialog,类的,可以用于打开文件和保存文件。,构造方法:,FileDialog(Frame parent);,创建打开文件对话框。,FileDialog(Frame parent,String title);,创建打开文件对话框,标题为,title,。,FileDialog(Frame parent,String title,int mode);,创建标题为,title,文件对话框,并且当,mode,的值为,FileDialog.LOAD,时为打开文件对话框,若为,FileDialog.SAVE,,则为保存对话框。,秦学礼,24,2024/10/1,常用的方法:,String getDirectory();,取得文件对话框内所选取文件的路径。,String getFile();,取得文件对话框内所选取的文件的文件名。,int getMode();,取得文件对话框的模式为,LOAD,还是,SAVE,。,void setDirectory(String dir);,设置文件对话框的默认打开文件的路径。,void setFile(String file);,设置文件对话框的默认打开文件。,void setMode(int mode);,设置文件对话框的模式为打开还是保存对话框。,构造方法中的,parent,是所属的窗口,生成文件对话框时,也同样需要用,show(),方法来显示它。,秦学礼,25,2024/10/1,例,8.8,一个使用,文件对话框类的,例子,可以打开和保存文件,。运行结果如图,8.9,所示。,算法分析:,(1),定义一个窗口类并声明监听者。,(2),定义文件对话框,一个打开文件对话框和一个保存文件对话框。,(3),在窗口中加入一个文本框、两个按钮组件。,(4),添加两个按钮的响应事件,把事件处理程序写在异常处理语句里。,源程序,(,javajcch08 FileDialog_Example.java,),秦学礼,26,2024/10/1,程序分析:,本例中使用了前面学到的,FileInputStream,类和,FileOutputStream,类,打开时把文件内容存到,byte,数组里,然后转化为字符串类型,显示在文本区里。保存时把文本区的内容保存到,byte,数组里,,getBytes(),把字符串类型转化为,byte,数组类型,然后写到文件里。对文件的读和写的动作必须写在,try-catch,块里。,
展开阅读全文