} } 【编程技巧】
(1) 从数组中单词与下标位置之间的对应关系认识翻译目标。 (2) 事件注册处理过程。
(3) 如何读取文本框数据并转化为整数和设置标签内容。
【自己练习】以上程序执行时要求用户输入一个0到9之间的数字,但由于没有提示,用户可能输入数据错误,从而产生程序运行错误,改进应用界面,给用户输入提示。
样例2:在应用程序窗体中安排两个文本框分别用来输入两个整数,两个按钮分别为 “+”,“*”,一个结果标签。点击按纽“+”将两文本框的数据做加法运算;点击按钮“*”做乘法运算,将结果显示在标签中。
【参考程序】
import java.awt.*;
import java.awt.event.*;
public class myFrame extends Frame implements ActionListener { 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); 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(\ else
res.setText(\ }
public static void main(String args[]) { Frame my= new myFrame(); my.setSize(200,200); my.setVisible(true); } }
【说明】本例在一个事件处理程序中有来自两个事件源的事件,因此在处理时要区分处理,区分命令按钮有两种办法:一种是通过按钮的命令名(默认是按钮上的文本),比较时通过字符串比较;另一种是通过事件的getSource()方法得到事件源对象,但这次比较的是与对象引用变量进行比较。
【编程技巧】
(1) 在同一事件处理方法中如何区分事件源;
(2) 将多个实例方法内要共享访问的部件对象定义为属性变量,如上面的标签和两个文本框。
【自己练习】利用匿名内嵌类为以上问题的每个事件源单独编写一段事件处理代码,这样在事件处理时不用区分事件源。
6.4 上机练习
? 基本题
1) 编写一个用户登录身份验证的图形界面程序,界面要求如下。用户名和密码输入正
确的话,鼠标点击sure按钮在文本框中显示welcome,否则显示error;如鼠标点击cancel按钮时,用户名和密码文本框都清空。(用户名为学生姓名,密码为123456)
2)创建带有标签和文本域的窗体。当用户在文本域中输入其姓名后,显示欢迎用户使用 java 编程的消息。例如用户输入姓名 flyhorse ,则显示消息“你好, flyhorse, 欢迎你使用 java 编程!”,并能正常关闭窗口。
3)设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。
? 提高题
2)编写一个用户注册信息填写验证程序,注册信息包括用户名、密码、EMAIL地址、联系电话。要求验证联系电话中只能输入数字,EMAIL地址中需要包括“@”符号,密码域不少于6位。要求联系电话在输入过程中保证不能有非数字,而其他两个域在点击注册按钮时再进行数据检查。
3)实现一个简单计算器。支持+、-、*、/、% 运算。界面如下图所示。
6.5 思考题
1) 一个部件在水平方向会改变大小,但垂直方向不变,则放到什么位置。
A.BorderLayout 布局的North或 South位置 B.FlowLayout 布局的第一个部件
C.BorderLayout 布局的East 或 West位置 D.BorderLayout 布局的Center位置 E.GridLayout布局中
2)以下AWT类中哪些实现部件的布局?
A.LayoutManager B.GridBagLayout C.ActionListener D.WindowAdapter E.FlowLayout
3) 容器的add( Component comp ) 和add( String name, Component comp ) 方法在加入什么部件时将抛出IllegalArgumentException
A.Button B.List C.Window D.TextArea E.包含这个容器的容器 4) 设有以下程序:
import java.awt.*;
public class FlowAp extends Frame{
public static void main(String argv[]){ FlowAp fa=new FlowAp(); fa.setSize(400,300); fa.setVisible(true); } FlowAp(){
add(new Button(\ add(new Button(\ add(new Button(\ add(new Button(\ } }
以下哪个描绘了应用的外观?
A.窗体每边有4个标记为One 到 Four的按钮 B.从顶到底有安排有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(){
Panel p = new Panel(); p.setBackground(Color.pink); p.add(new Button(\ p.add(new Button(\ p.add(new Button(\ add(\
setLayout(new FlowLayout()); setSize(300,300); setVisible(true); } }
A.按钮按从左向右的次序出现在窗体的底部 B.按钮按从左向右的次序出现在窗体的顶部 C.按钮将不显示
D.只有一个按钮显示占满整个窗体 7) 以下程序调试结果为 //演示事件处理 import java.awt.*; import java.awt.event.*;
public class MyWc extends Frame implements WindowListener{ public static void main(String argv[]){ MyWc mwc = new MyWc(); }
public void windowClosing(WindowEvent we){ System.exit(0); }
public void MyWc(){ setSize(300,300);
setVisible(true); } }
A.编译错误
B.创建的窗体会关闭掉 C.运行无输出
D.编译错误,import语句前不能有注释语句 8) 以下叙述正确的有?
A.如果一个部件注册多个监听者,事件只会被最后一个监听者处理。 B.如果一个部件注册多个监听者,事件将被所有监听者处理。 C.一个部件注册多个监听者将导致编译出错。 D.可以将一个部件已注册的监听者移去。 9) 以下哪个是正确的事件处理方法
A.mousePressed(MouseEvent e){} B.MousePressed(MouseClick e){} C.functionKey(KeyPress k){}
D.componentAdded(ContainerEvent e){} 10) 关于JDK 1.1的事件处理以下那条为真?
A.一个类可以实现多个监听者接口;
B.如果一个类实现一个监听者接口,它只要覆盖其用到的方法; C.MouseMotionAdapter类的所有方法返回类型均为void。 11) 以下哪个是MenuItem类的方法?
A.setVisible( boolean b ) B.setEnabled( boolean b ) C.getSize()
D.setForeground( Color c ) E.setBackground( Color c )
12)以下类中,哪个类的子类不能直接创建实例?
A.Panel B.Dialog C.Container D.Frame