图形用户界面编程_第1页
图形用户界面编程_第2页
图形用户界面编程_第3页
图形用户界面编程_第4页
图形用户界面编程_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验7.1  图形用户界面编程1 实验目的(1) 掌握图形用户界面的布局设置; (2) 掌握事件驱动编程的特点,如何区分事件源。(3) 掌握文本框、文本域、标签、按钮等部件的操作方法。(4)掌握鼠标与键盘事件编程(低级事件)(5)了解菜单等其他图形部件的使用2 知识要点2.1  awt包简介(1)java.awt包可用于编写Java Application和Applet的图形界面。(2) AWT组件层次关系见图11-1,所有的GUI标准组件都是AWT包中的根类Component(构件)类的子类。2.2 容器、布局和部件(1)容器Container是Componen

2、t的子类,具有构件的所有性质,并且能放置其他容器和构件。l         一个容器能容纳若干构件;l         调用容器对象的add方法将构件加入到容器中;l         窗体(Window)容器在不同的操作平台上显示不同的外观。l         面板(Panel)

3、容器是没有标题和边框的透明容器,不能单独存在,必须加入窗体等其他容器中使用。(2)各类GUI部件的特点l         按钮(Button):单击产生ActionEvent事件l         复选框(Checkbox):选择时产生ItemEvent事件l         复选框组(CheckboxGroup):只能选一,单选;l  

4、       下拉列表(Choice):只能选1项;l         列表(List):可以选多项;l         文本框(TextField):只能显示一行,按回车触发ActionEvent;l         文本域(TextArea):显示多行文本。l   

5、      画布(Canvas):只能绘图,处理鼠标和键盘事件。l         窗体(Frame):顶级容器,关闭时触发WindowEvent;l         面板(Panel): 可进行嵌套布局的容器,面板作为一个部件加入到窗体容器中,面板作为容器又可以放其他面板和部件。l         对话框(

6、Dialog):包括模式和非模式两类,依赖其他窗体。l         文件对话框(FileDialog):用于打开和关闭文件。l         菜单(Menu)、菜单条(MenuBar)和菜单项(MenuItem):只能对Frame创建菜单,菜单条中添加菜单,菜单中可以添加菜单项或子菜单。(3)布局Java通过布局管理器对所有构件进行管理,以支持跨平台的动态布局效果。常见布局管理器有5种,见表11-1所示。表11-1 常见布局管理器

7、及特点布局特点FlowLayout布局组件按照加入的先后顺序从左到右排放,放不下再换至下一行,部件大小不变,是Applet和Panel的默认布局。BorderLayout布局将容器分为东(East)、南(South)、西(West)、北(North)、中(Center)五个区域,加入组件用命令:add(方位名字符串, 组件)。是Frame、Dialog的默认布局。GridLayout布局将容器空间分为若干行乘若干列的网格区域,组件按从左向右,从上到下的次序被加到各单元格中,组件的大小将调整为与单元格大小相同。CardLayout布局将组件叠成卡片的形式,每个组件占用一块卡片,通过卡片的翻动选择

8、要显示的组件。GridBagLayout布局在GridLayout的基础上发展而来,将整个容器分成若干行、列组成的单元,但各行可以有不同的高度,每栏也可以有不同的宽度,一个部件可以占用一个、也可以占用多个单元格。2.3 事件处理(1) 事件处理机制l         涉及对象有事件源、事件、事件处理者(监听者)。事件源是发生事件的对象;事件对象是提供事件相关信息的对象;事件处理者则是消化事件,完成特定处理的对象。l         Ja

9、va采用委托(授权)事件处理机制;事件源对其可能发生的事件分别授权不同的事件处理者处理;通过如下命令注册监听者:addXXXListener(XXXListener a);其中,XXX与相应事件类型相关,例如:按钮点击动作事件对应标记为“Action”.要注销监听者使用removeXXXListener(XXXListener a);l         事件处理者必须实现某类事件相对应的接口,只有符合接口规范的对象才能作为事件处理者,通过编写相应方法实现事件的处理。例如,ActionListener接口中定义了如下

10、方法用来处理事件。    public void actionPerformed(ActionEvent e); l         Java为每类事件提供了一个相应的接口。(2) 事件与事件处理l         java.util.EventObject是所有事件类的父类;java.awt.AWTEvent是所有AWT事件类的父类,其包括低级事件和基于语义的高级事件。l   

11、;      XXXEvent对应的事件处理接口通常为XXXListener,但鼠标事件(MouseEvent)对应的事件处理接口有两个,一个是MouseListener,另一个是MouseMotionListener,它们分别用来处理鼠标的移动(含拖动)与鼠标的点击动作。各类接口的事件处理方法见表11-2。表11-2 AWT事件接口及处理方法描述信息接口名称方法(事件)点击按钮、点击菜单项、文本框按回车等动作ActionListeneractionPerformed(ActionEvent)选择了可选项的项目ItemListeneritemS

12、tateChanged(ItemEvent)文本部件内容改变TextListenertextValueChanged(TextEvent)移动了滚动条等组件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠标移动MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠标点击等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouse

13、Exited(MouseEvent)mouseClicked(MouseEvent)键盘输入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)组件收到或失去焦点FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)组件移动、缩放、显示/隐藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(Component

14、Event)componentShown(ComponentEvent)窗口事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified (WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)容器增加/删除组件ContainerListenercomponentAdded(ContainerEve

15、nt)componentRemoved(ContainerEvent)l         事件适配器Java中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter,在该类中以空方法体实现了相应接口的所有方法,程序员设计可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,从而减轻工作量。l         在事件处理代码中区分事件源在事件处理代码中可通过相应的方法得到事件源对象或与事件源相关的信息

16、,见表11-3,通过这些信息可区分事件源。表11-3 在事件处理代码中区分事件源事件类型方法作用ActionEventgetSource()返回事件对象对应的事件源对象getActionCommand()返回动作命令字符串WindowEventgetWindow()返回窗体事件对应的窗体对象ItemEventgetItemSelectable()返回选择事件对应的事件源对象KeyEventgetKeyChar()返回键盘事件按键对应的字符getKeyCode()返回键盘事件所按键的编码值3 样例程序 样例1:在应用程序窗体中安排1个文本框,一个标签。在文本框输入一个数字(0-9),按

17、回车键,在标签处显示对应的英文单词。 0-zero,1-one,.【参考程序】import java.awt.*;import java.awt.event.*;   public class  myFrame  extends Frame implements ActionListener   Label res; TextField my;String word="zero","one","two","three","four","

18、five","six","seven","eight","nine","ten"public  myFrame ()         my =new TextField(20);   res=new Label(" 英文单词   ");   setLayout(new FlowLayout();   add(

19、my); add(res);             my.addActionListener(this); public void actionPerformed(ActionEvent e)     String s=my.getText();     int n=Integer.parseInt(s);       res.setText( wordn ); &

20、#160;  public static void main(String args)    Frame  my= new myFrame();   my.setSize(300,300);   my.setVisible(true); 【编程技巧】(1) 从数组中单词与下标位置之间的对应关系认识翻译目标。(2) 事件注册处理过程。(3) 如何读取文本框数据并转化为整数和设置标签内容。【自己练习】以上程序执行时要求用户输入一个0到9之间的数字,但由于没有提示,用户可能输入数据错误,从而产生程序运行错误,改

21、进应用界面,给用户输入提示。样例2:在应用程序窗体中安排两个文本框分别用来输入两个整数,两个按钮分别为 “+”,“*”,一个结果标签。点击按纽“+”将两文本框的数据做加法运算;点击按钮“*”做乘法运算,将结果显示在标签中。 【参考程序】import java.awt.*; import java.awt.event.*;   public class  myFrame  extends Frame implements ActionListener   Label res; TextField f1,f2;public  myFram

22、e ()         f1 =new TextField(20);   f2 =new TextField(20);   Button b1=new Button("+");   Button b2=new Button("*");   res=new Label("  运算结果  ");   setLayout(new GridLayout(

23、3,2);   add(f1);  add(f2);   add(b1);  add(b2);  add(res);             b1.addActionListener(this);    b2.addActionListener(this); public void actionPerformed(ActionEvent e)     int x1=I

24、nteger.parseInt(f1.getText();    int x2=Integer.parseInt(f2.getText();    if (e.getActionCommand().equals("+")  /区分用户点击的是哪个按钮       res.setText(""+(x1+x2);      else     

25、  res.setText(""+(x1*x2);     public static void main(String args)    Frame  my= new myFrame();   my.setSize(200,200);   my.setVisible(true); 【说明】本例在一个事件处理程序中有来自两个事件源的事件,因此在处理时要区分处理,区分命令按钮有两种办法:一种是通过按钮的命令名(默认是按钮上的文本),比较时通过字符串

26、比较;另一种是通过事件的getSource()方法得到事件源对象,但这次比较的是与对象引用变量进行比较。【编程技巧】(1) 在同一事件处理方法中如何区分事件源;(2) 将多个实例方法内要共享访问的部件对象定义为属性变量,如上面的标签和两个文本框。【自己练习】利用匿名内嵌类为以上问题的每个事件源单独编写一段事件处理代码,这样在事件处理时不用区分事件源。样例3:实现一个简单的图像浏览器,部署“上一张”、“下一张”两个按钮,点击按钮可前后翻阅图片。【参考程序】import java.applet.*; import java.awt.*; import java.awt.event.*;public

27、 class ShowAnimator extends Applet implements ActionListener   Image m_Images;      /保存图片序列的Image数组   int totalImages = 18;  /图片序列中的图片总数18   int currentImage = 0;  /当前时刻应该显示图片序号   Button b1,b2;  public void init()     &#

28、160;  m_Images = new ImagetotalImages;        for(int i=0; i<totalImages; i+)         m_Imagesi = getImage(getDocumentBase(), "imagesimg00" +(i+1)+".gif");   /将图像对象存入数组中     But

29、ton b1=new Button("上一张");     Button b2=new Button("下一张");     setLayout(new BorderLayout();     Panel operate=new Panel();          operate.add(b1);operate.add(b2);  

30、60;  add("South",operate);   /操作控制面板放在底部     b1.addActionListener(this);     b2.addActionListener(this);        public void paint(Graphics g)       g.drawImage(m_ImagescurrentImage,10,1

31、0,this);  /显示当前那张图片    public void actionPerformed(ActionEvent e)     if (e.getSource()=b1)     if ( currentImage>0)        currentImage = -currentImage;   /上一张        

32、;  else       currentImage = +currentImage % totalImages;  /下一张      repaint();     【编程技巧】(1) 将绘制图像存入数组中,利用一个变量代表当前要绘制图像对应下标。(2) 事件处理中,前后翻动图片的实现就是控制变量值的增减。(3) 由repaint()方法调用paint方法实现图像重绘。【自己练习】增加一个画布,将图片绘制到画布上,如何修改程序。样例4:统计一个

33、文本域中行、单词、字符的数量。【分析】在图形界面中除了安排文本域输入数据外,还安排一个按钮触发统计操作,另外安排3个标签显示结果。界面采用GridLayout布局,如图11-3所示。【参考程序】    import java.awt.*;    import java.awt.event.*;    import java.applet.*;       public class TextCounter extends Applet  

34、                                     implements ActionListener            T

35、extArea textInput;      Label lineCountLabel; Label wordCountLabel;Label charCountLabel;                  public void init()               t

36、extInput = new TextArea();                             Panel south = new Panel();          south.setLayout( new GridLayo

37、ut(4,1,2,2) );                        Button countButton = new Button("Process the Text");          countButton.addActionListener(this)

38、;          south.add(countButton);                lineCountLabel = new Label("  Number of lines:");          south.add(lineCo

39、untLabel);                  wordCountLabel = new Label("  Number of words:");          south.add(wordCountLabel);        

40、;            charCountLabel = new Label("  Number of chars:");          south.add(charCountLabel);                &

41、#160;   setLayout( new BorderLayout(2,2) );          add(textInput, BorderLayout.CENTER);          add(south, BorderLayout.SOUTH);            

42、60;                         public void actionPerformed(ActionEvent evt)                     &#

43、160;              String text;  / 用户从文本框输入的文本.                      int charCt, wordCt, lineCt;  / 字符,单词和行的个数.   &#

44、160;                  text = textInput.getText();                      charCt = text.length();  / 字符数正好为文本串的长度.

45、0;                               wordCt = 0;           for (int i = 0; i < charCt; i+)   

46、60;           boolean startOfWord;   / 是否位置为i的字符是一个单词的开头?              if ( Character.isLetter(text.charAt(i) = false )         &#

47、160;       startOfWord = false;  / 否. 不是字母.              else if (i = 0)                 startOfWord = true;  

48、 / 是. 这是文本的首字母.              else if ( Character.isLetter(text.charAt(i-1) )                 startOfWord = false;  / 否. 前面有一个字母.   

49、0;          else if ( text.charAt(i-1) = ''' && i > 1                              

50、0;     && Character.isLetter(text.charAt(i-2) )                 startOfWord = false;  / 否.  是一个单词的继续              els

51、e                 startOfWord = true;   / 是. 该字符前面为非字母.              if (startOfWord)          

52、       wordCt+;                                 /* 文本行数只要统计换行字符出现的次数再加1 */       

53、0;              lineCt = 1;           for (int i = 0; i < charCt; i+)               if (text.charAt(i) = 'n') 

54、;                lineCt+;                                   

55、       lineCountLabel.setText("  Number of Lines:  " + lineCt);           wordCountLabel.setText("  Number of Words:  " + wordCt);        &#

56、160;  charCountLabel.setText("  Number of Chars:  " + charCt);                    【编程技巧】(1) 统计文本域中的文本行数即是统计回车符出现的次数。(2) 统计单词数要考虑的因素比较多,hes算一个单词,所以为了简化处理,引入一个变量startOfWord记录当前字符是否为单词开始,只有为开始时

57、才进行单词计数统计。样例5: 在图形界面中,安排一个文本框和文本域。将文本框键入的字符同时显示在文本域中,也既同步显示。【参考程序1】利用文本部件的textValueChanged事件(高级语义事件)。import java.applet.*;import java.awt.*;import java.awt.event.*;public class TextIn extends Applet implements TextListener,ActionListener TextField tf;TextArea ta;String pre=""public void in

58、it() tf=new TextField(20);ta=new TextArea(8,20);add(tf);add(ta);tf.addTextListener(this);tf.addActionListener(this);public void textValueChanged(TextEvent e)   /有数据输入时发生if (e.getSource()=tf)         String s = pre+'rn'+tf.getText();    

59、     ta.setText(s);  /将pre值与文本框的文本合并写入文本域中public void actionPerformed(ActionEvent e)   /在文本框按回车触发        pre=ta.getText();  /将文本域现有内容记录下来;        tf.setText(""); /清空文本框【参考程序2】利用键盘低

60、级语义事件。import java.applet.*;import java.awt.*;import java.awt.event.*;public class TextIn extends Applet TextField tf;TextArea ta;public void init() tf=new TextField(20);ta=new TextArea(8,20);add(tf);add(ta);tf.addKeyListener(new keyProcess();class keyProcess extends KeyAdapter   /内嵌类public void

61、 keyTyped(KeyEvent e)           ta.append(""+e.getKeyChar();  /将击键的字符添加到文本框       【分析说明】不难看出第2个程序更简单,第1个程序每次是获取整个文本框的数据并将数据加入到文本域中,而不是加入当前输入的字符,所以引入一个变量pre记住文本框上次输入回车前的内容。【编程技巧】(1) 在高级语义事件处理中如何实现文本内容的拼接,如果要从文本框

62、取最后一个字符添加到文本域可以考虑用charAt()方法,思考如何修改程序;(2) 如何清除文本框数据;利用变量记录文本域的以前内容;(3) 在低级事件中如何获取按键字符值,并将其添加到文本域中。4 上机练习²      基本题1)创建带有标签和文本框的窗体。当用户在文本框中输入其姓名后按回车,显示欢迎用户使用 java 编程的消息。例如用户输入姓名 flyhorse ,则显示消息“你好, flyhorse, 欢迎你使用 java 编程!”,并能正常关闭窗口。  2)在Applet界面中安排一个文本框和一个标签,在文本框输入

63、一个整数按回车后,在标签中显示该数最高位数字。3)设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。4)编写一个鼠标位置跟踪程序,在鼠标所在位置为中心绘制一个红色十字架。²      提高题1)编制一个声音播放控制程序,在Applet面板上安排“播放”和“停止”两个按钮,点击“播放”将播放声音,点击“停止”可停止播放。另外,Applet启动和离开时将自动播放和停止播放,要播放的声音文件名由Applet参数提供。2)编写一个用户注册信息填写

64、验证程序,注册信息包括用户名、密码、EMAIL地址、联系电话。要求验证联系电话中只能输入数字,EMAIL地址中需要包括“”符号,密码域不少于6位。要求联系电话在输入过程中保证不能有非数字,而其他两个域在点击注册按钮时再进行数据检查。3)实现一个简单计算器。支持+、-、*、/、% 运算。界面如下图所示。4)利用鼠标事件实现一个拉橡皮筋方式绘制直线的程序。鼠标按下开始算始点,拖动鼠标至终点,在始点和终点之间绘制直线,在拖动鼠标的过程中,总在始点和鼠标位置绘制直线,但只有最后释放鼠标时直线为最终需要的直线。5) 创建一个窗体应用程序,含有三个按钮,“sin”、“cos”、“exit” ,并有一个 c

65、anvas 控件,用鼠标单击“sin”、“cos”按钮,在 canvas 画布上画出对应的曲线,单击“exit”将关闭窗体退出。6)实现一个玩五子棋的对弈程序,要求能判断对弈哪方胜。5 思考题1) 一个部件在水平方向会改变大小,但垂直方向不变,则放到什么位置。ABorderLayout 布局的North或 South位置BFlowLayout 布局的第一个部件CBorderLayout 布局的East 或 West位置DBorderLayout 布局的Center位置EGridLayout布局中2)以下AWT类中哪些实现部件的布局?ALayoutManagerBGridBagLayoutCAc

66、tionListenerDWindowAdapterEFlowLayout3) 容器的add( Component comp ) 和add( String name, Component comp ) 方法在加入什么部件时将抛出IllegalArgumentException AButton    BList    CWindow    DTextAreaE包含这个容器的容器4) 设有以下程序:import java.awt.*;public class FlowAp extends Frame 

67、;  public static void main(String argv)      FlowAp fa=new FlowAp();      fa.setSize(400,300);      fa.setVisible(true);    FlowAp()     add(new Button("One");     add(new Button("Two");     add(new Button("Three");     add(new Button("Four");  以下哪个描绘了应用的外观?A窗体每边有4个标记为One 到 Four的按钮B从顶到底有安排有4个标记为One 到 Four的按钮C一个很大的标记为 Four的按钮在正中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论