还剩16页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第4章图形用户界面设计【1】什么是图形用户界面?试列举出图形用户界面中你使用过的组件[解答]图形用户界面或图形用户接口GraphicalUserInterface,GUI是指采用图形方式显示的计算机操作环境用户接口与早期计算机使用的命令行界面相比,图形界面对于用户来说更为简便易用(比如你用windowsXP和使用DOS操作系统的差别)GUI是事件驱动的,也就是说,一旦用户与GUI交互,GUI组件就会生成”事件“(动作)常见交互包括移动鼠标、单击鼠标按钮、在文字段输入、从菜单选择一个选项以及关闭一个窗口等等在windwosXP的GUI中,使用过窗口,菜单条,按钮等【2】简述Java的事件处理机制什么是事件源?什么是监听者?在Java的图形用户界面中,谁可以充当事件源?谁可以充当监听者?[解答]java的事件处理机制就是,事件源允许监听器注册的事件对象,在事件发生的时候想相关的注册对象发送一个,事件对象,监听器便根据相关的信息来选择运行相关的代码事件源英文名为eventsource是指事件发生的地方,也就是引起事件的组件,按钮Button文本组件等都可以当做事件源比如说,你点击一个button,那么button就是事件源,要想使button对某些事件进行响应,你就需要注册特定的监听者(具体请看第5章的事件处理)监听者英文名为eventhandler事件处理者,又叫监听器具体的对监听的事件类,当它监听到eventobject产生的时候,它就调用相应的方法,进行处理在java中,AWT组件和swing组件都可以当做事件源;java.awt.event.*里面各种类都可以为监听者【3】动作事件的事件源可以有哪些?如何响应动作事件?[解答]动作事件的事件源可以有ButtonJButtonMenuItem等响应动作事件的过程一般为声明和实例化事件源,如:Buttonbtn=newButton“确定”;注册监听btn.addActionListenerthis;//this指明是在当前类实现处理实现接口publicvoidactionPerformedActionEvente{//具体代码};【4】说明文本框与标签之间的区别[解答]文本框(TextField)和标签Label都可以进行文字表达TextField允许用户编辑单行文本的文本组件他可以添加相应的监听事件;而Label对象是一个可在容器中放置文本的组件一个标签只显示一行只读文本文本可由应用程序更改,但是用户不能直接对其进行编辑【5】编写程序包含一个标签、一个文本框和一个按钮,当用户单击按钮时,程序把文本框中的内容复制到标签中[解答]Test4_
5.javaimportjava.awt.*;importjava.awt.event.*;publicclassTest4_5extendsFrameimplementsActionListener{Labellb;TextFieldtxtFl;Buttonbtn;publicTest4_5{//界面布局和初始化super文本框和标签的练习;setSize260200;setVisibletrue;setLayoutnewFlowLayout;lb=newLabel;//用空格占位以防止label个别字符出现问题txtFl=newTextField20;btn=newButton显示字符;addtxtFl;addbtn;addlb;addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEventwe{System.exit0;}};validate;//增加监听btn.addActionListenerthis;}publicvoidactionPerformedActionEvente{Stringstrtmp=txtFl.getText;lb.setTextstrtmp;lb.setForegroundColor.red;}publicstaticvoidmainString[]args{newTest4_5;}}【6】设计一个加法计算器,如图
4.25所示(课本P124),在文本框中输入两个整数,单击“=”按钮时,在第三个文本框中显示这两个数据的和[解答]Test4_
6.javaimportjava.awt.*;importjava.awt.event.*;classTest4_6extendsFrameimplementsActionListener{TextFieldtxtFl1txtFl2txtFl3;Buttonbtn;publicTest4_6{super简单加法运算器;setSize300200;setVisibletrue;setLayoutnewFlowLayout;txtFl1=newTextField5;txtFl2=newTextField5;txtFl3=newTextField10;btn=newButton=;addnewLabel请输入整数;addtxtFl1;addnewLabel+;addtxtFl2;addbtn;addtxtFl3;addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEventwe{System.exit0;}};validate;btn.addActionListenerthis;}publicvoidactionPerformedActionEvente{intadd=Integer.parseInttxtFl
1.getText+Integer.valueOftxtFl
2.getText.intValue;//两种字符串转整形的方法txtFl
3.setTextString.valueOfadd;}publicstaticvoidmainString[]args{newTest4_6;}}【7】说明文本框与文本区之间的区别,它们都可以引发什么事件?如何响应此事件?[解答]TextField对象是允许编辑单行文本的文本组件TextArea对象是显示文本的多行区域可以将它设置为允许编辑或只读TextFiled和TextArea可以引用KeyEventActionEvent分别用使用组件的addKeyListener方法注册和addActionListener以接收事件【8】设计一个计算器,其中要使用按钮、文本框、布局管理和标签等构件,能实现加、减、乘、除运算[解答]Text4_
8.javaimportjava.awt.*;importjava.awt.event.*;publicclassTest4_8extendsFrameimplementsActionListener{TextFieldtxtFl1txtFl2txtFl3;Buttonbtn1btn2btn3btn4btn5;publicTest4_8{super简单的四则运算器;setSize300400;setVisibletrue;setLayoutnewGridLayout31;txtFl1=newTextField5;txtFl2=newTextField5;txtFl3=newTextField5;btn1=newButton+;btn2=newButton-;btn3=newButton*;btn4=newButton÷;Panelp1=newPanel;p
1.addtxtFl1;p
1.addtxtFl2;p
1.addnewLabel=;p
1.addtxtFl3;Panelp2=newPanel;p
2.addbtn1;p
2.addbtn2;p
2.addbtn3;p
2.addbtn4;addnewLabel请在下面输入运算数并运算规则进行运算:;addp1;addp2;addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEventwe{System.exit0;}};validate;btn
1.addActionListenerthis;btn
2.addActionListenerthis;btn
3.addActionListenerthis;btn
4.addActionListenerthis;}publicvoidactionPerformedActionEvente{floatnum1=Float.valueOftxtFl
1.getText.floatValue;floatnum2=Float.valueOftxtFl
2.getText.floatValue;//两种字符串转整形的方法floatrs=0;ife.getSource==btn1{rs=num1+num2;txtFl
3.setTextString.valueOfrs;}elseife.getSource==btn2{rs=num1-num2;txtFl
3.setTextString.valueOfrs;}elseife.getSource==btn3{rs=num1*num2;txtFl
3.setTextString.valueOfrs;}elseife.getSource==btn4{rs=num1/num2;txtFl
3.setTextString.valueOfrs;}}publicstaticvoidmainString[]args{newTest4_8;}}【9】创建一个窗体,窗体中有一个按钮,当单击按钮后,就会弹出一个新窗体[解答]Test4_
9.javaimportjava.awt.*;importjava.awt.event.*;publicclassTest4_9extendsFrameimplementsActionListener{Buttonbtn;publicTest4_9{super弹出窗口练习;setSize300200;setVisibletrue;setLayoutnewBorderLayout;btn=newButton点击我会弹出窗口;Panelp1=newPanel;p
1.addnewLabel;p
1.addbtn;p
1.addnewLabel;addSouthp1;validate;addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEvente{System.exit0;}};btn.addActionListenerthis;}publicvoidactionPerformedActionEvente{newTest4_9;}publicstaticvoidmainString[]args{newTest4_9;}}【10】编写图形界面的Application程序,该程序包含一个菜单,选择这个菜单的“退出”选项可以关闭Application的窗口并结束程序[解答]Test4_
10.javaimportjava.awt.*;importjava.awt.event.*;publicclassTest4_10extendsFrame{MenuBarmbar;Menufileedithelp;MenuItemfile_openfile_newfile_exit;MenuItemedit_copyedit_cut;MenuItemhelp_about;publicTest4_10{super菜单Application程序;setSize400300;setVisibletrue;mbar=newMenuBar;setMenuBarmbar;file=newMenu文件;edit=newMenu编辑;help=newMenu帮助;mbar.addfile;mbar.addedit;mbar.addhelp;file_new=newMenuItem新建;file_open=newMenuItem打开;file_exit=newMenuItem退出;file.addfile_new;file.addfile_open;file.addSeparator;file.addfile_exit;edit_copy=newMenuItem复制;edit_cut=newMenuItem粘贴;edit.addedit_copy;edit.addedit_cut;help_about=newMenuItem关于;help.addhelp_about;validate;}publicstaticvoidmainString[]args{newTest4_10;}}【11】什么是容器的布局?试列举并简述Java中常用的几种布局策略[解答]AWT容器分为两类外部容器和内部容器其中,外部容器一般会独立存在,例如Frame类;而内部容器则会嵌套在外部容器内部使用,例如Panel类容器的布局是指对添加的各个组件进行有序的、统一的对位置进行编排,使其更加美观(下面的例子参照网上http://book.csdn.net/bookfiles/347/
10034713585.shtml)1.顺序布局顺序布局(FlowLayout)是最基本的一种布局,面板的默认布局就是顺序布局顺序布局指的是把图形元件一个接一个地放在面板上下面是一个顺序布局的例子packagesample;importjava.awt.*;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassMyFlowLayout{ privateFramef; privateButtonbutton1button2button3; publicstaticvoidmainStringargs[]{ MyFlowLayoutmflow=newMyFlowLayout; mflow.go; } publicvoidgo{ f=newFrameFlowLayout演示; f.addWindowListenernewWindowAdapter{ publicvoidwindowClosingWindowEventevt{ f.setVisiblefalse; f.dispose; System.exit0; } }; //f.setLayoutnewFlowLayout; f.setLayoutnewFlowLayoutFlowLayout.LEADING2020; button1=newButton确定; button2=newButton打开; button3=newButton关闭; f.addbutton1; f.addbutton2; f.addbutton3; f.setSize200200; f.pack; f.setVisibletrue; }}程序运行结果见图10-3图10-3 顺序布局(FlowLayout)2.边界布局边界布局(BorderLayout)包括5个区北区、南区、东区、西区和中区这5个区在面板上的分布规律是“上北下南,左西右东”下面是一个边界布局的例子packagesample;importjava.awt.*;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassMyBorderLayout{ Framef; Buttoneastsouthwestnorthcenter; publicstaticvoidmainStringargs[]{ MyBorderLayoutmb=newMyBorderLayout; mb.go; } publicvoidgo{ f=newFrameBorderLayout演示; f.addWindowListenernewWindowAdapter{ publicvoidwindowClosingWindowEventevt{ f.setVisiblefalse; f.dispose; System.exit0; } }; f.setBounds00300300; f.setLayoutnewBorderLayout; north=newButton北; south=newButton南; east=newButton东; west=newButton西; center=newButton中; f.addBorderLayout.NORTHnorth; f.addBorderLayout.SOUTHsouth; f.addBorderLayout.EASTeast; f.addBorderLayout.WESTwest; f.addBorderLayout.CENTERcenter; f.setVisibletrue; }}程序运行结果见图10-4图10-4 边界布局(BorderLayout)3.网格布局网格布局(GridLayout)把面板分成一个个大小相等的网格,你可以给出网格的行数和列数下面是一个网格布局的例子packagesample;importjava.awt.*;importjava.awt.event.*;publicclassMyGridLayout{ privateFramef; privateButton[]btn; publicstaticvoidmainStringargs[]{ MyGridLayoutgrid=newMyGridLayout; grid.go; } publicvoidgo{ f=newFrameGridLayout演示; f.addWindowListenernewWindowAdapter{ publicvoidwindowClosingWindowEventevt{ f.setVisiblefalse; f.dispose; System.exit0; } }; f.setLayoutnewGridLayout331010; btn=newButton
[9]; forinti=0;i=8;i++{ intj=i+1; btn[i]=newButton+j; f.addbtn[i]; } //f.pack; f.setSize100100; f.setVisibletrue; }}程序运行结果见图10-5图10-5 网格布局(GridLayout)4.卡片布局卡片布局(CardLayout)把每个组件看作一张卡片,好像一副扑克牌,它们叠在一起,每次只有最外面的一个组件可以被看到packagesample;importjava.awt.*;importjava.awt.event.*;publicclassMyCardLayout{ publicstaticvoidmainStringargs[]{ newMyCardLayout.go; } publicvoidgo{ finalFramef=newFrameCardLayout演示; f.addWindowListenernewWindowAdapter{ publicvoidwindowClosingWindowEventevt{ f.setVisiblefalse; f.dispose; System.exit0; } }; f.setSize300100; f.setLayoutnewCardLayout; finalFramef1=f; forinti=1;i=5;++i{ Buttonb=newButtonButton+i; b.setSize10025; b.addActionListenernewActionListener{ publicvoidactionPerformedActionEventae{ CardLayoutcl=CardLayoutf
1.getLayout; cl.nextf1; } }; f.addbbutton+i; } f.setVisibletrue; }}程序运行结果见图10-6图10-6 卡片布局(CardLayout)单击按钮Button1后,显示下一个按钮Button2,依此类推5.网格包布局网格包(GridBag)布局是基于网格布局之上的一种改进和基本的网格布局不同的是,一个组件可以跨越一个或多个网格,这样一来增加了布局的灵活性为了处理网格的跨越性,我们可以使用GridBagConstraints类有兴趣的读者可以参考JavaAPI来了解它packagesample;importjava.awt.*;importjava.util.*;importjava.awt.event.*; publicclassMyGridBagLayoutextendsPanel{ protectedvoidmakebuttonStringname GridBagLayoutgridbag GridBagConstraintsc{ Buttonbutton=newButtonname; gridbag.setConstraintsbuttonc; addbutton; } publicvoidgo{ GridBagLayoutgridbag=newGridBagLayout; GridBagConstraintsc=newGridBagConstraints; setFontnewFontHelveticaFont.PLAIN14; setLayoutgridbag; c.fill=GridBagConstraints.BOTH; c.weightx=
1.0; makebuttonButton001gridbagc; makebuttonButton2gridbagc; makebuttonButton3gridbagc; c.gridwidth=GridBagConstraints.REMAINDER;//endrow makebuttonButton4gridbagc; c.weightx=
0.0; //resettothedefault makebuttonButton5gridbagc;//anotherrow c.gridwidth=2;//GridBagConstraints.RELATIVE;//next-to-lastinrow makebuttonButton6gridbagc; c.gridwidth=GridBagConstraints.REMAINDER;//endrow makebuttonButton007gridbagc; c.gridwidth=1; //resettothedefault c.gridheight=2; c.weighty=
1.0; makebuttonButton8gridbagc; c.weighty=
1.0; //resettothedefault c.gridwidth=GridBagConstraints.REMAINDER;//endrow c.gridheight=1; //resettothedefault makebuttonButton9gridbagc; makebuttonButton10gridbagc; setSize300100; } publicstaticvoidmainStringargs[]{ finalFramef=newFrameGridBagLayout演示; f.addWindowListenernewWindowAdapter{ publicvoidwindowClosingWindowEventevt{ f.setVisiblefalse; f.dispose; System.exit0; } }; MyGridBagLayoutgb=newMyGridBagLayout; gb.go; f.addCentergb; f.pack; f.setVisibletrue; } }程序运行结果见图10-7图10-7 网格包(GridBag)布局【12】根据本章所学的内容编程设计一个模拟的文字编辑器,并用菜单实现退出的功能[解答]Test4_
12.javaimportjava.awt.*;importjava.awt.event.*;publicclassTest4_12extendsFrameimplementsActionListener{MenuBarmbar;Menufileedithelp;MenuItemfile_openfile_newfile_savefile_exit;MenuItemedit_copyedit_cutedit_paseedit_del;MenuItemhelp_about;Buttonbtn_copybtn_pasebtn_cutbtn_del;TextAreatxtAr;booleanifdo;StringBufferstrtmp;publicTest4_12{super菜单Application程序;setSize400300;setVisibletrue;setLayoutnewBorderLayout;mbar=newMenuBar;setMenuBarmbar;strtmp=newStringBuffer;file=newMenu文件;edit=newMenu编辑;help=newMenu帮助;mbar.addfile;mbar.addedit;mbar.addhelp;file_new=newMenuItem新建;file_open=newMenuItem打开;file_open.setEnabledfalse;file_save=newMenuItem保存;file_save.setEnabledfalse;file_exit=newMenuItem退出;file.addfile_new;file.addfile_open;file.addfile_save;file.addSeparator;file.addfile_exit;edit_copy=newMenuItem复制newMenuShortcutKeyEvent.VK_C;edit_pase=newMenuItem粘贴newMenuShortcutKeyEvent.VK_V;edit_cut=newMenuItem剪切newMenuShortcutKeyEvent.VK_X;edit_del=newMenuItem删除newMenuShortcutKeyEvent.VK_DELETE;edit.addedit_copy;edit.addedit_pase;edit.addedit_cut;edit.addedit_del;help_about=newMenuItem关于;help.addhelp_about;txtAr=newTextArea810;Panelp1=newPanel;btn_copy=newButton复制;btn_cut=newButton剪切;btn_pase=newButton粘贴;btn_del=newButton删除;p
1.setLayoutnewFlowLayoutFlowLayout.LEFT;p
1.addbtn_copy;p
1.addbtn_cut;p
1.addbtn_pase;p
1.addbtn_del;addNorthp1;addCentertxtAr;validate;file_new.addActionListenerthis;file_open.addActionListenerthis;file_save.addActionListenerthis;file_exit.addActionListenerthis;edit_copy.addActionListenerthis;edit_pase.addActionListenerthis;edit_cut.addActionListenerthis;edit_del.addActionListenerthis;help_about.addActionListenerthis;btn_copy.addActionListenerthis;btn_cut.addActionListenerthis;btn_pase.addActionListenerthis;btn_del.addActionListenerthis;addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEventwe{System.exit0;}};}publicvoidactionPerformedActionEvente{ife.getSource==file_new{txtAr.setTextnull;}elseife.getSource==file_open{}elseife.getSource==file_save{}elseife.getSource==file_exit{System.exit0;//退出}elseife.getSource==edit_copy||e.getSource==btn_copy{//复制的实现strtmp.delete0strtmp.length;strtmp.appendtxtAr.getSelectedText;}elseife.getSource==edit_pase||e.getSource==btn_pase{//粘贴的实现txtAr.insertstrtmp.toStringtxtAr.getSelectionEnd;}elseife.getSource==edit_cut||e.getSource==btn_cut{//剪切的实现strtmp.delete0strtmp.length;strtmp.appendtxtAr.getSelectedText;Stringstrtmp1=newStringtxtAr.getText.substring0txtAr.getSelectionStart;Stringstrtmp2=newStringtxtAr.getText.substringtxtAr.getSelectionEndtxtAr.getText.length;//返回一个新的String,它包含此序列当前所包含的字符子序列txtAr.setTextstrtmp1+strtmp2;}elseife.getSource==edit_del||e.getSource==btn_del{Stringstrtmp1=newStringtxtAr.getText.substring0txtAr.getSelectionStart;Stringstrtmp2=newStringtxtAr.getText.substringtxtAr.getSelectionEndtxtAr.getText.length;//返回一个新的String,它包含此序列当前所包含的字符子序列txtAr.setTextstrtmp1+strtmp2;}}publicstaticvoidmainString[]args{newTest4_12;}}【13】创建一个输入对话框,从对话框中输入文字,当按下“确定”按钮后,能在屏幕上显示输入的文字[解答]Test4_
13.javaimportjava.awt.*;importjava.awt.event.*;classTest4_13extendsFrameimplementsActionListener{TextAreatxtAr;Buttonbtn1;publicTest4_13{super对话框练习;setSize300400;setVisibletrue;setLayoutnewBorderLayout;btn1=newButton打开对话框;txtAr=newTextArea810;addNorthbtn1;addCentertxtAr;validate;addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEventwe{System.exit0;}};btn
1.addActionListenerthis;}publicvoidactionPerformedActionEvente{DiaObjdia=newDiaObjthistxtAr;//声明和实例话对话框传递frame和txtar参数}publicstaticvoidmainString[]args{newTest4_13;}}classDiaObjimplementsActionListener{Framefr=newFrame;TextAreatxtAr2=newTextArea810;TextFieldtxtFl=newTextField20;ButtonbtnSend=newButton发送文字;Dialogdia;//初始化DiaObj并定义参数frtxtAr2publicDiaObjFramefrTextAreatxtAr2{this.txtAr2=txtAr2;this.fr=fr;dia=newDialogfr传递消息对话框..true;dia.setSize200100;dia.setLayoutnewFlowLayout;dia.addtxtFl;dia.addbtnSend;btnSend.addActionListenerthis;dia.addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEventwe{dia.setVisiblefalse;//退出对话框}};dia.validate;dia.setVisibletrue;}publicvoidactionPerformedActionEvente{txtAr
2.appendtxtFl.getText+\n;txtFl.setText;//清空内容}}。