《2022年图形用户界面编程推荐 .pdf》由会员分享,可在线阅读,更多相关《2022年图形用户界面编程推荐 .pdf(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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 容器、布局和部件名师资料总结 - - -精品资料欢迎下载 - - - - - - -
2、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - (1)容器Container是 Component的子类,具有构件的所有性质,并且能放置其他容器和构件。一个容器能容纳若干构件;调用容器对象的add 方法将构件加入到容器中;窗体( Window)容器在不同的操作平台上显示不同的外观。面板( Panel )容器是没有标题和边框的透明容器,不能单独存在,必须加入窗体等其他容器中使用。(2)各类 GUI部件的特点按钮( Button ):单击产生ActionEvent事件复选框( Checkbox):
3、 选择时产生ItemEvent事件复选框组( CheckboxGroup): 只能选一,单选;下拉列表( Choice ): 只能选 1 项;列表 (List):可以选多项;文本框( TextField):只能显示一行,按回车触发ActionEvent;文本域( TextArea ): 显示多行文本。画布( Canvas): 只能绘图,处理鼠标和键盘事件。窗体( Frame):顶级容器,关闭时触发WindowEvent;面板 (Panel): 可进行嵌套布局的容器, 面板作为一个部件加入到窗体容器中, 面板作为容器又可以放其他面板和部件。对话框( Dialog ) : 包括模式和非模式两类,依
4、赖其他窗体。文件对话框( FileDialog): 用于打开和关闭文件。菜单( Menu )、菜单条( MenuBar)和菜单项( MenuItem) : 只能对 Frame创建菜单,菜单条中添加菜单,菜单中可以添加菜单项或子菜单。(3)布局Java 通过布局管理器对所有构件进行管理,以支持跨平台的动态布局效果。常见布局管理器有 5 种,见表 11-1 所示。表 11-1 常见布局管理器及特点布局特点FlowLayout 布局组件按照加入的先后顺序从左到右排放,放不下再换至下一行,部件大小不变,是Applet和 Panel 的默认布局。BorderLayout布局将容器分为东 (East )、
5、 南(South)、西(West)、北 ( North ) 、中( Center )五个区域,加入组件用命令:add( 方位名字符串, 组件 ) 。是 Frame、Dialog的默认布局。GridLayout布局将容器空间分为若干行乘若干列的网格区域, 组件按从左向右,从上到下的次序被加到各单元格中,组件的大小将调整名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 为与单元格大小相同。CardLayout 布局将组件叠成卡片的形
6、式,每个组件占用一块卡片,通过卡片的翻动选择要显示的组件。GridBagLayout布局在 GridLayout 的基础上发展而来,将整个容器分成若干行、列组成的单元,但各行可以有不同的高度,每栏也可以有不同的宽度,一个部件可以占用一个、也可以占用多个单元格。2.3 事件处理(1) 事件处理机制涉及对象有事件源、事件、事件处理者(监听者)。事件源是发生事件的对象;事件对象是提供事件相关信息的对象;事件处理者则是消化事件,完成特定处理的对象。Java 采用委托(授权)事件处理机制;事件源对其可能发生的事件分别授权不同的事件处理者处理;通过如下命令注册监听者:addXXXListener(XXXL
7、istener a);其中, XXX与相应事件类型相关,例如:按钮点击动作事件对应标记为“Action ” .要注销监听者使用removeXXXListener(XXXListener a);事件处理者必须实现某类事件相对应的接口,只有符合接口规范的对象才能作为事件处理者,通过编写相应方法实现事件的处理。例如 ,ActionListener接口中定义了如下方法用来处理事件。 public void actionPerformed(ActionEvent e); Java 为每类事件提供了一个相应的接口。(2) 事件与事件处理java.util.EventObject是所有事件类的父类;java
8、.awt.AWTEvent是所有 AWT 事件类的父类,其包括低级事件和基于语义的高级事件。XXXEvent 对应的事件处理接口通常为XXXListener ,但鼠标事件(MouseEvent)对应的事件处理接口有两个,一个是 MouseListener,另一个是MouseMotionListener,它们分别用来处理鼠标的移动(含拖动) 与鼠标的点击动作。 各类接口的事件处理方法见表11-2 。表 11-2 AWT 事件接口及处理方法描述信息接口名称方法(事件)点击按钮、点击菜单项、文本框按回车等动作ActionListeneractionPerformed(ActionEvent)选择了可
9、选项的项目ItemListeneritemStateChanged(ItemEvent)文本部件内容改变TextListenertextValueChanged(TextEvent)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - 移动了滚动条等组件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠标移动MouseMotionListenermouseDragge
10、d(MouseEvent)mouseMoved(MouseEvent)鼠标点击等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)键盘输入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)组件收到或失去焦点FocusListenerfocusGained(FocusEvent)focusLos
11、t(FocusEvent)组件移动、缩放、显示/ 隐藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)窗口事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified (WindowEvent)wind
12、owClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)容器增加 / 删除组件ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)事件适配器Java 中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter ,在该类中以空方法体实现了相应接口的所有方法,程序员设计可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,从而减轻工作量。在事件处理代码中区分
13、事件源在事件处理代码中可通过相应的方法得到事件源对象或与事件源相关的信息,见表11-3 ,通过这些信息可区分事件源。表 11-3 在事件处理代码中区分事件源名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - 事件类型方法作用ActionEventgetSource()返回事件对象对应的事件源对象getActionCommand()返回动作命令字符串WindowEventgetWindow()返回窗体事件对应的窗体对象ItemEve
14、ntgetItemSelectable()返回选择事件对应的事件源对象KeyEventgetKeyChar()返回键盘事件按键对应的字符getKeyCode()返回键盘事件所按键的编码值3 样例程序样例 1:在应用程序窗体中安排1 个文本框, 一个标签。 在文本框输入一个数字(0-9 ),按回车键,在标签处显示对应的英文单词。 0-zero,1-one,.【参考程序】import java.awt.*;import java.awt.event.*; public class myFrame extends Frame implements ActionListener Label res;
15、TextField my;String word=zero,one,two,three,four,five,six,seven,eight,nine,ten;public myFrame () my =new TextField(20); res=new Label( 英文单词 ); setLayout(new FlowLayout(); add(my); add(res); my.addActionListener(this); public void actionPerformed(ActionEvent e) String s=my.getText(); int n=Integer.pa
16、rseInt(s); res.setText( wordn ); public static void main(String args) Frame my= new myFrame();名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - my.setSize(300,300); my.setVisible(true); 【编程技巧】(1) 从数组中单词与下标位置之间的对应关系认识翻译目标。(2) 事件注册处理过程。(3) 如何读
17、取文本框数据并转化为整数和设置标签内容。【自己练习】以上程序执行时要求用户输入一个0 到 9 之间的数字,但由于没有提示,用户可能输入数据错误,从而产生程序运行错误,改进应用界面,给用户输入提示。样例 2:在应用程序窗体中安排两个文本框分别用来输入两个整数,两个按钮分别为“+”,“* ”,一个结果标签。点击按纽“+”将两文本框的数据做加法运算;点击按钮“*”做乘法运算,将结果显示在标签中。【参考程序】import java.awt.*; import java.awt.event.*; public class myFrame extends Frame implements ActionLi
18、stener Label res; TextField f1,f2;public myFrame () f1 =new TextField(20); f2 =new TextField(20); Button b1=new Button(+); Button b2=new Button(*); res=new Label( 运算结果 ); setLayout(new GridLayout(3,2); add(f1); add(f2); add(b1); add(b2); add(res); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
19、 - - 名师精心整理 - - - - - - - 第 6 页,共 17 页 - - - - - - - - - b1.addActionListener(this); b2.addActionListener(this); public void actionPerformed(ActionEvent e) int x1=Integer.parseInt(f1.getText(); int x2=Integer.parseInt(f2.getText(); if (e.getActionCommand().equals(+) /区分用户点击的是哪个按钮 res.setText(+(x1+x2
20、); else res.setText(+(x1*x2); public static void main(String args) Frame my= new myFrame(); my.setSize(200,200); my.setVisible(true); 【说明】 本例在一个事件处理程序中有来自两个事件源的事件,因此在处理时要区分处理,区分命令按钮有两种办法:一种是通过按钮的命令名(默认是按钮上的文本),比较时通过字符串比较;另一种是通过事件的getSource()方法得到事件源对象,但这次比较的是与对象引用变量进行比较。【编程技巧】(1) 在同一事件处理方法中如何区分事件源;(2
21、) 将多个实例方法内要共享访问的部件对象定义为属性变量,如上面的标签和两个文本框。【自己练习】 利用匿名内嵌类为以上问题的每个事件源单独编写一段事件处理代码,这样在事件处理时不用区分事件源。样例 3:实现一个简单的图像浏览器,部署“上一张”、“下一张”两个按钮, 点击按钮可前后翻阅图片。【参考程序】import java.applet.*; import java.awt.*; import java.awt.event.*;public class ShowAnimator extends Applet implements ActionListener Image m_Images; /保
22、存图片序列的Image 数组名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - int totalImages = 18; /图片序列中的图片总数18 int currentImage = 0; /当前时刻应该显示图片序号 Button b1,b2; public void init() m_Images = new ImagetotalImages; for(int i=0; i0) currentImage = -curren
23、tImage; /上一张 else currentImage = +currentImage % totalImages; /下一张 repaint(); 【编程技巧】(1) 将绘制图像存入数组中,利用一个变量代表当前要绘制图像对应下标。(2) 事件处理中,前后翻动图片的实现就是控制变量值的增减。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 17 页 - - - - - - - - - (3) 由 repaint()方法调用 paint方法实现图像重绘。【自己练习】 增
24、加一个画布, 将图片绘制到画布上,如何修改程序。样例 4:统计一个文本域中行、单词、字符的数量。【分析】在图形界面中除了安排文本域输入数据外, 还安排一个按钮触发统计操作,另外安排 3 个标签显示结果。界面采用GridLayout布局,如图 11-3 所示。【参考程序】 import java.awt.*; import java.awt.event.*; import java.applet.*; public class TextCounter extends Applet implements ActionListener TextArea textInput; Label lineCo
25、untLabel; Label wordCountLabel;Label charCountLabel; public void init() textInput = new TextArea(); Panel south = new Panel(); south.setLayout( new GridLayout(4,1,2,2) ); Button countButton = new Button(Process the Text); countButton.addActionListener(this); south.add(countButton); 名师资料总结 - - -精品资料欢
26、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 17 页 - - - - - - - - - lineCountLabel = new Label( Number of lines:); south.add(lineCountLabel); wordCountLabel = new Label( Number of words:); south.add(wordCountLabel); charCountLabel = new Label( Number of chars:); south.add(cha
27、rCountLabel); setLayout( new BorderLayout(2,2) ); add(textInput, BorderLayout.CENTER); add(south, BorderLayout.SOUTH); public void actionPerformed(ActionEvent evt) String text; / 用户从文本框输入的文本. int charCt, wordCt, lineCt; / 字符 , 单词和行的个数. text = textInput.getText(); charCt = text.length(); / 字符数正好为文本串的
28、长度. wordCt = 0; for (int i = 0; i 1 & Character.isLetter(text.charAt(i-2) ) startOfWord = false; / 否. 是一个单词的继续 else startOfWord = true; / 是. 该字符前面为非字母. if (startOfWord) wordCt+; /* 文本行数只要统计换行字符出现的次数再加1 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 17 页 - -
29、 - - - - - - - lineCt = 1; for (int i = 0; i charCt; i+) if (text.charAt(i) = n) lineCt+; lineCountLabel.setText( Number of Lines: + lineCt); wordCountLabel.setText( Number of Words: + wordCt); charCountLabel.setText( Number of Chars: + charCt); 【编程技巧】(1) 统计文本域中的文本行数即是统计回车符出现的次数。(2) 统计单词数要考虑的因素比较多,h
30、es 算一个单词,所以为了简化处理,引入一个变量 startOfWord记录当前字符是否为单词开始,只有为开始时才进行单词计数统计。样例 5: 在图形界面中,安排一个文本框和文本域。将文本框键入的字符同时显示在文本域中,也既同步显示。【参考程序1】利用文本部件的textValueChanged事件(高级语义事件)。import java.applet.*; import java.awt.*; import java.awt.event.*;public class TextIn extends Applet implements TextListener,ActionListener Tex
31、tField tf;TextArea ta;String pre=;public void init() 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) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
32、 - - - - - - - 第 11 页,共 17 页 - - - - - - - - - String s = pre+rn+tf.getText(); ta.setText(s); /将 pre 值与文本框的文本合并写入文本域中public void actionPerformed(ActionEvent e) /在文本框按回车触发 pre=ta.getText(); /将文本域现有内容记录下来; tf.setText(); /清空文本框【参考程序2】利用键盘低级语义事件。import java.applet.*; import java.awt.*;import java.awt.ev
33、ent.*;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 keyTyped(KeyEvent e) ta.append(+e.getKeyChar(); /将击键的字符添加到文本框 【分析说明】
34、不难看出第2 个程序更简单, 第 1 个程序每次是获取整个文本框的数据并将数据加入到文本域中,而不是加入当前输入的字符,所以引入一个变量pre 记住文本框上次输入回车前的内容。【编程技巧】(1) 在高级语义事件处理中如何实现文本内容的拼接, 如果要从文本框取最后一个字符添加到文本域可以考虑用charAt()方法 , 思考如何修改程序;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 17 页 - - - - - - - - - (2) 如何清除文本框数据;利用变量记录文本
35、域的以前内容;(3) 在低级事件中如何获取按键字符值,并将其添加到文本域中。4 上机练习基本题1)创建带有标签和文本框的窗体。当用户在文本框中输入其姓名后按回车,显示欢迎用户使用 java 编程的消息。 例如用户输入姓名 flyhorse , 则显示消息 “你好, flyhorse, 欢迎你使用 java 编程!”,并能正常关闭窗口。2)在 Applet 界面中安排一个文本框和一个标签,在文本框输入一个整数按回车后,在标签中显示该数最高位数字。3)设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。
36、4)编写一个鼠标位置跟踪程序,在鼠标所在位置为中心绘制一个红色十字架。提高题1)编制一个声音播放控制程序,在Applet 面板上安排“播放”和“停止”两个按钮,点击“播放”将播放声音,点击“停止”可停止播放。另外,Applet启动和离开时将自动播放和停止播放,要播放的声音文件名由Applet参数提供。2)编写一个用户注册信息填写验证程序,注册信息包括用户名、密码、EMAIL地址、联系电话。要求验证联系电话中只能输入数字,EMAIL地址中需要包括“ ”符号,密码域不少于 6 位。要求联系电话在输入过程中保证不能有非数字,而其他两个域在点击注册按钮时再进行数据检查。3)实现一个简单计算器。支持+、
37、- 、*、/ 、% 运算。界面如下图所示。4)利用鼠标事件实现一个拉橡皮筋方式绘制直线的程序。鼠标按下开始算始点,拖动鼠标至终点, 在始点和终点之间绘制直线,在拖动鼠标的过程中,总在始点和鼠标位置绘制直线,但只有最后释放鼠标时直线为最终需要的直线。5) 创建一个窗体应用程序,含有三个按钮,“sin ”、“ cos”、“ exit ” ,并有一个 canvas 控件,用鼠标单击“sin ”、“ cos”按钮,在 canvas 画布上画出对应的曲线,单击“ exit ”将关闭窗体退出。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
38、名师精心整理 - - - - - - - 第 13 页,共 17 页 - - - - - - - - - 6)实现一个玩五子棋的对弈程序, 要求能判断对弈哪方胜。5 思考题1) 一个部件在水平方向会改变大小,但垂直方向不变,则放到什么位置。ABorderLayout 布局的 North 或 South位置BFlowLayout 布局的第一个部件CBorderLayout 布局的 East 或 West 位置DBorderLayout 布局的 Center 位置EGridLayout布局中2)以下 AWT 类中哪些实现部件的布局?ALayoutManagerBGridBagLayoutCActi
39、onListenerDWindowAdapterEFlowLayout3) 容器的 add( Component comp ) 和 add( String name, Component comp ) 方法在加入什么部件时将抛出IllegalArgumentException AButton BList CWindow D TextAreaE包含这个容器的容器4) 设有以下程序:import java.awt.*; public class FlowAp extends Frame public static void main(String argv) FlowAp fa=new FlowA
40、p(); fa.setSize(400,300); fa.setVisible(true); FlowAp() add(new Button(One); add(new Button(Two); add(new Button(Three); add(new Button(Four); 以下哪个描绘了应用的外观?名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 17 页 - - - - - - - - - A窗体每边有4 个标记为One 到 Four 的按钮B从顶到底有安排
41、有4 个标记为 One 到 Four 的按钮C一个很大的标记为 Four 的按钮在正中央D运行时指示没有设置布局管理器的错误5) 如何设置当前的布局管理器A使用 setLayout 方法B一旦创建了部件,不能改变部件的布局管理器。C使用 setLayoutManager 方法D使用 updateLayout 方法6) 以下代码运行后外观为?import java.awt.*; public class CompLay extends Frame public static void main(String argv) CompLay cl = new CompLay(); CompLay()
42、Panel p = new Panel(); p.setBackground(Color.pink); p.add(new Button(One); p.add(new Button(Two); p.add(new Button(Three); add(South,p); setLayout(new FlowLayout(); setSize(300,300); setVisible(true); A按钮按从左向右的次序出现在窗体的底部B按钮按从左向右的次序出现在窗体的顶部C按钮将不显示D只有一个按钮显示占满整个窗体7) 以下程序调试结果为 /演示事件处理import java.awt.*;
43、import java.awt.event.*; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 17 页 - - - - - - - - - public class MyWc extends Frame implements WindowListener public static void main(String argv) MyWc mwc = new MyWc(); public void windowClosing(WindowEvent we) Syste
44、m.exit(0); public void MyWc() setSize(300,300); setVisible(true); A编译错误B创建的窗体会关闭掉C运行无输出D编译错误,import语句前不能有注释语句8) 以下叙述正确的有?A如果一个部件注册多个监听者,事件只会被最后一个监听者处理。B如果一个部件注册多个监听者,事件将被所有监听者处理。C一个部件注册多个监听者将导致编译出错。D可以将一个部件已注册的监听者移去。9) 以下哪个是正确的事件处理方法AmousePressed(MouseEvent e) BMousePressed(MouseClick e) CfunctionKe
45、y(KeyPress k) DcomponentAdded(ContainerEvent e)10) 关于 JDK 1.1 的事件处理以下那条为真?A一个类可以实现多个监听者接口; B 如果一个类实现一个监听者接口,它只要覆盖其用到的方法; C MouseMotionAdapter类的所有方法返回类型均为void 。11) 以下哪个是MenuItem 类的方法 ?AsetVisible( boolean b )BsetEnabled( boolean b )CgetSize()DsetForeground( Color c )名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 17 页 - - - - - - - - - EsetBackground( Color c )12)以下类中,哪个类的子类不能直接创建实例?APanel BDialog CContainer DFrame名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 17 页 - - - - - - - - -
限制150内