2024年1月21日发(作者:)
.
实验7
1. 编一个程序,包含以下文件。
(1)文件,在该文件中定义接口Shape,该接口在shape包中。
属性:PI。
方法:求面积的方法area()。
(2)文件,在该文件中定义圆类Circle,该类在circle包中,实现Shape接口。
属性:圆半径radius。
方法:构造方法;实现接口中求面积方法area();求周长方法perimeter()。
(3)“”文件,在该文件中定义圆柱体类Cylinder,该类口在cylinder包中,继承圆类。
属性:圆柱体高度height。
方法:构造方法;求表面积方法area();求体积方法volume()。
(4)X5_3_文件,在该文件中定义主类X5_3_6,该类在默认包中,其中包含主方法main(),在主方法中创建两个圆类对象cir1和cir2,具体尺寸自己确定,并显示圆的面积和周长;再创建两个圆柱体类的对象cy1和cy2,具体尺寸自己确定,然后分别显示圆柱体cy1和cy2的底圆的面积和周长以及它们各自的体积和表面积。
【编程分析】本题主要考察接口、包、继承、封装等问题。编程步骤如下:
第一步:首先创建p1包,在其中创建Shape接口
// 文件
package p1; // 创建p1包
public interface Shape{ // 定义Shape接口
…
}
第二步:创建Circle类和Cylinder类,它们都定义在p2包中。
// 文件
package p2; // 创建p2包
import p1.*;
public class Circle implements Shape{ // 定义实现Shape接口的Circle类
…
}
// 文件
package p2;
public class Cylinder extends Circle{
…
}
// 创建继承Circle类的Cylinder类
第三步:创建主类,在其中的main()方法中创建对象,实现相应的功能。
// X5_3_文件
package p3;
import p2.*;
public class X5_3_6 { // 定义主类
public static void main(String[] args) {
…
}
}
.
.
【参考程序】
// X5_3_文件
package p3;
import p2.*;
public class X5_3_6 { // 定义主类
public static void main(String[] args) {
Circle cir1 = new Circle(120.5);
Circle cir2 = new Circle(183.8);
n(": "+());
n("ter: "+ter());
n(": "+());
n("ter: "+ter());
Cylinder cy1 = new Cylinder(27.3,32.7);
Cylinder cy2 = new Cylinder(133.5,155.8);
n(": "+());
n(": "+());
n(": "+());
n(": "+());
}
}
// 文件
package p1; // 创建p1包
public interface Shape{ // 定义Shape接口
double PI=;
double area(); // 求面积方法
}
// 文件
package p2; // 创建p2包
import p1.*;
public class Circle implements Shape{ // 定义实现Shape接口的Circle类
double radius; // 半径
public Circle(double r){
radius = r;
}
public double area(){ // 实现Shape接口中的方法(这是必须的)
return PI*radius*radius;
}
public double perimeter(){ // 定义求圆周长的方法
return 2*PI*radius;
}
}
// 文件
package p2;
public class Cylinder extends Circle{ // 创建继承Circle类的Cylinder类
.
.
}
double height;
public Cylinder(double r,double h){
super(r);
height = h;
}
public double area(){
return 2*PI*radius*radius+2*PI*radius*height;
}
public double volume(){
return PI*radius*radius*height;
}
2)定义一个接口OneToN,在接口中包含一个抽象方法disp()。定义Sum和Pro类,并分别用不同代码实现ONeToN的disp()方法,在Sum的方法中计算1~n的和,在Pro的方法中计算1~n的乘积
interface OneToN
{
public void disp(int n);
}
class Sum implements OneToN
{
public void disp(int n)
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum=sum+i;
}
n(sum);
}
}
class Pro implements OneToN
{
public void disp(int n)
{
long pro=1;
for(int i=1;i<=n;i++)
{
pro=pro*i;
}
n(pro);
}
}
.
.
public class interfaceTest {
public static void main(String[] args) {
// TODO code application logic here
Sum x=new Sum();
(100);
}
}
3)改错,上传正确答案,并以注释形式给出错误原因
class SuperClass
{
public SuperClass(String msg)
{ n("SuperClass constructor: " +msg);}
}
class SubClass extends SuperClass
{
public SubClass(String msg)
{
Super(msg); //父类没有无参的构造方法,应采用super显示调用父类的构造方法
n("SubClass constructor");
}
}
public class Test1 {
public static void main(String[] args) {
SubClass descendent = new SubClass();
}
}
4) 利用多态性编程,创建一个抽象类shape类,定义一个函数Area为求面积的公共方法,再定义Triangle,Rectangle和circle类,实现computerArea方法;增加display方法,显示name和area,并在Triangle,Rectangle和circle类覆盖该方法,并为每个类增加自己的构造方法;在主类中创建不同对象,求得不同形状的面积。
答案略。
实验8
一、选择题
1.关于异常的含义,下列描述中最正确的一个是( D )。
A.程序编译错误 B.程序语法错误
C.程序自定义的异常事件 D.程序编译或运行时发生的异常事件
【解析】异常就是程序编译或运行时发生的异常事件。
2.自定义异常时,可以通过对下列哪一项进行继承?( C )
A.Error类 B.Applet类
C.Exception类及其子类 D.AssertionError类
.
.
【解析】自定义异常类时,该类必须继承Exception类及其子类。
3.对应try和catch子句的排列方式,下列哪一项是正确的?( A )
A.子类异常在前,父类异常在后 B.父类异常在前,子类异常在后
C.只能有子类异常 D.父类和子类不能同时出现在try语句块中
【解析】对应try和catch子句的排列方式,要求子类异常(范围小的异常)在前,父类异常(范围大的异常)在后。
4.运行下面程序时,会产生什么异常?( A )
public class X7_1_4 {
public static void main(String[] args) {
int x = 0;
int y = 5/x;
int[] z = {1,2,3,4};
int p = z[4];
}
}
A.ArithmeticException B.NumberFormatException
C.ArrayIndexOutOfBoundsException D.IOException
【解析】当程序执行到“int y = 5/x”语句时,发生异常,程序中止执行,因此发生ArithmeticException异常。
5.运行下面程序时,会产生什么异常?( C )
public class X7_1_5 {
public static void main(String[] args) {
int[] z = {1,2,3,4};
int p = z[4];
int x = 0;
int y = 5/x;
}
}
A.ArithmeticException B.NumberFormatException
C.ArrayIndexOutOfBoundsException D.IOException
【解析】当程序执行到“int p = z[4]”语句时,发生异常,程序中止执行,因此发生ArrayIndexOutOfBoundsException异常。
6.下列程序执行的结果是( B )。
public class X7_1_6 {
public static void main(String[] args) {
try{
return;
}
finally{
n("Finally");
}
}
}
A.程序正常运行,但不输出任何结果 B.程序正常运行,并输出Finally
C.编译通过,但运行时出现异常 D.因为没有catch子句,因此不能通过编译
【解析】在执行try-catch-finally语句块时,最后必须执行finally语句块中的内容,而本程序没有异常发生,因此程序正常运行,并输出Finally。
7.下列代码中给出正确的在方法体内抛出异常的是( B )。
A.new throw Exception(" "); B.throw new Exception(" ");
C.throws IOException(); D.throws IOException;
【解析】在方法体内抛出异常时只能使用throw,而不能使用throws,另外,“new Exception("
.
.
")”是创建一个异常,因此B是正确的。
8.下列描述了Java语言通过面相对象的方法进行异常处理的好处,请选出不在这些好处范围之内的一项( C )
A.把各种不同的异常事件进行分类,体现了良好的继承性
B.把错误处理代码从常规代码中分离出来
C.可以利用异常处理机制代替传统的控制流程
D.这种机制对具有动态运行特性的复杂程序提供了强有力的支持
【解析】异常处理机制不能代替传统的流程控制。
二、编程题
1.编写一个系统自动抛出的、系统自行处理的数组大小为负数的程序。
【编程分析】
当编写的程序中没有处理异常的语句时,系统会自动抛出异常,并自行进行处理。
【参考程序】
public class X7_3_1 {
public static void main(String[] args){
int[] a = new int[-5];
for(int i=0; i<; i++){
a[i] = 10 + i;
}
}
}
【运行结果】
Exception in thread "main" veArraySizeException
at X7_3_(X7_3_:3)
2.编写一个由throw抛出的、系统自行处理的数组下标越界的程序。
【编程分析】
当由throw抛出异常后,如果程序本身不进行异常处理,Java系统将采用默认的处理方式进行处理。
【参考程序】
import .*;
public class X7_3_2 {
public static void main(String[] args)throws IOException{
InputStreamReader isr = new InputStreamReader();
BufferedReader br = new BufferedReader(isr);
int[] a = new int[5];
int n = nt(ne());
if(n>5) // 当输入的n值大于5时将由throw抛出异常
throw new ArrayIndexOutOfBoundsException();
n("程序继续执行");
for(int i=0; i a[i] = 10 + i; (a[i]+"t"); } . . n(); } } 【运行结果】 8 Exception in thread "main" ndexOutOfBoundsException at (:9) 3.编写一个系统自动抛出的、由try-catch捕捉处理的分母为0以及数组下标越界的程序。 【编程分析】 当在try语句块中出现分母为0的情况时,如果在catch参数中有ArithmeticException对象,则就能捕捉到该异常并进行处理;同样,当在try语句块中出现分母为数组下标越界的情况时,如果在catch参数中有ArrayIndexOutOfBoundsException对象,则就能捕捉到该异常并进行处理。 【参考程序】 import .*; public class X7_3_3 { public static void main(String args[]) throws IOException{ InputStreamReader isr = new InputStreamReader(); BufferedReader br = new BufferedReader(isr); n("请输入两个整数:"); int a = nt( ne()); int b = nt( ne()); try{ // 当输入的b为0时,就会出现算术异常 n(a/b); } catch(ArithmeticException e){ // 捕捉算术异常并进行处理 n("出现被0除的情况!"); } int c[] =new int[4], sum = 0; try{ // 当出现数组下标越界时就会抛出异常 for(int i = 0; i<5; i++) sum += c[i]; n( " sum = " + sum); } catch(ArrayIndexOutOfBoundsException e){// 捕捉数组下标越界异常并处理 n("数组下标越界!"); } } } 【运行结果】 请输入两个整数: 20 0 出现被0除的情况! 数组下标越界! . . 4.编写一个由throw抛出的、由try-catch捕捉处理的分母为0以及数组下标越界的程序。 【编程分析】 当在程序出现异常之前利用throw语句来抛出异常,可以做到防患于未然,提前进行异常处理,将由被动处理异常转变为主动防止异常发生。 【参考程序】 import .*; public class X7_3_4 { public static void main(String args[]) throws IOException{ InputStreamReader isr = new InputStreamReader(); BufferedReader br = new BufferedReader(isr); n("请输入两个整数:"); int a = nt( ne()); int b = nt( ne()); try{ if(b==0) throw new ArithmeticException("抛出算术异常"); n(a/b); } catch(ArithmeticException e){ tackTrace(); n("出现被0除的情况!"); } int c[] ={1, 2, 3, 4}, sum = 0; try{ for(int i = 0; i<5; i++) { if(i >= 4) throw new ArrayIndexOutOfBoundsException("抛出数组下标越界 sum += c[i]; n( " sum = " + sum); } } catch(ArrayIndexOutOfBoundsException e){ tackTrace(); n("数组下标越界!"); } 异常"); } } 5.自定义两个异常类NumberTooBigException和NumberTooSmallException,在其中定义各自的构造方法,分别打印输出“发生数字太大异常”和“发生数字太小异常”。然后在主类中定义一个带throws的方法numberException(int x),当x>100时通过throw抛出NumberTooBigException异常,当x<0时通过throw抛出NumberTooSmallException异常;最后在main()方法中调用该方法,实现从键盘中输入一个整数,如果输入的是负数,引发. . NumberTooSmallException异常,如果输入的数大于100,引发。NumberTooBigException异常,否则输出“没有发生异常”。 【编程分析】本题主要考察自定义异常的方法。 第一步:定义异常类NumberTooBigException class NumberTooBigException extends Exception{ NumberTooBigException(){ super("发生数字太大异常 "); } } 第二步:定义异常类NumberTooSmallException class NumberTooSmallException extends Exception{ NumberTooSmallException(){ super("发生数字太小异常"); } } 第三步:在主类X7_3_5中定义numberException()方法。 public static void numberException(int x) throws NumberTooBigException, NumberTooSmallException{ if(x>100) throw new NumberTooBigException(); else if (x<0) throw new NumberTooSmallException(); else n("没有异常发生") ; } 第四步:在main()方法中调用numberException()方法并捕捉和处理由此方法引起的异常。 【参考程序】 import .*; public class X7_3_5 { public static void main(String args[]) throws IOException{ InputStreamReader isr = new InputStreamReader(); BufferedReader br = new BufferedReader(isr); ("请输入一个整数:"); int a = nt( ne()); try{ numberException(a); }catch(NumberTooBigException e){ tackTrace(); }catch(NumberTooSmallException e){ tackTrace(); } } public static void numberException(int x) throws NumberTooBigException, . . NumberTooSmallException{ if(x>100) throw new NumberTooBigException(); else if (x<0) throw new NumberTooSmallException(); else n("没有异常发生") ; } } class NumberTooBigException extends Exception{ NumberTooBigException(){ super("发生数字太大异常 "); } } class NumberTooSmallException extends Exception{ NumberTooSmallException(){ } 实验9 一、选择题 1.下列说法中错误的一项是( B )。 A.构件是一个可视化的能与用户在屏幕上交互的对象 B.构件能够独立显示出来 C.构件必须放在某个容器中才能正确显示 D.一个按钮可以是一个构件 【解析】构件不能独立显示,它必须放在某个容器中才能正确显示。 2.进行Java基本GUI设计需要用到的包是( C )。 A. B. C. D. 【解析】进行Java基本GUI设计需要用到的包是和 3.Container是下列哪一个类的子类( D )? A.Graphics B.Window C.Applet D.Component 【解析】Container类是由Component类派生的。 4.的父类是( B )。 A. B. Window C. Panel D.Pane 【解析】的父类 Window。 5.下列哪个方法可以将MenuBar加入Frame中( D )? A.setMenu() B.addMenuBar() C.add() D.setMenuBar() 【解析】可以将MenuBar加入Frame中的方法是setMenuBar()。 6.下列叙述中,错误的一项是( D )。 A.采用GridLayout布局,容器中的每个构件平均分配容器空间 B.采用GridLayout布局,容器中的每个构件形成一个网络状的布局 . } super("发生数字太小异常"); . C.采用GridLayout布局,容器中的构件按照从左到右、从上到下的顺序排列 D.采用GridLayout布局,容器大小改变时,每个构件不再平均分配容器空间 【解析】采用GridLayout布局,容器大小改变时,每个构件平均分配容器空间。 7.当单击鼠标或拖动鼠标时,触发的事件是( D )。 A.KeyEvent B.ActionEvent C.ItemEvent D.MouseEvent 【解析】对鼠标操作,触发的事件是MouseEvent事件。 8.下列哪一项不属于Swing的顶层组件( C )? A.JApplet B.JDialog C.JTree D.Jframe 【解析】JTree 只有在容器中才能显示,它不属于swing的顶层组件。 9.下列说法中错误的一项是( D )。 A.在实际编程中,一般使用的是Component类的子类 B.在实际编程中,一般使用的是Container类的子类 C.Container类是Component类的子类 D.容器中可以放置构件,但是不能够放置容器 【解析】容器中既可以放置构件,也可以放置容器。 10.下列哪一项不属于AWT布局管理器( D )? A.GridLayout B.CardLayout C.BorderLayout D.BoxLayout 【解析】BoxLayout属于swing布局管理器,不属于AWT布局管理器。 11.下列说法中错误的一项是( A )。 A.MouseAdapter是鼠标运动适配器 B.WindowAdapter是窗口适配器 C.ContainerAdapter是容器适配器 D.KeyAdapter是键盘适配器 【解析】MouseAdapter是鼠标适配器,而MouseMotionAdapte才是鼠标运动适配器。 12.布局管理器可以管理构件的哪个属性( A )? A.大小 B.颜色 C.名称 D.字体 【解析】布局管理器可以管理构件的位置和大小,而不能管理构件的其他属性。 13.编写AWT图形用户界面的时候,一定要import的语句是( B )。 A.import ; B.import .*; C.import D.import .*; 【解析】“import .*;”语句的含义是加载awt包中的所有类,而其他都不是。 14.在类中若要处理ActionEvent事件,则该类需要实现的接口是( B )。 A.Runnable B.ActionListener C.Serializable D.Event 【解析】处理ActionEvent事件的类需要实现的接口是ActionListener,它其中包含了actionPerformed()方法。 15.下列不属于包中的基本概念的一项是( C )。 A.容器 B.构件 C.线程 D.布局管理器 【解析】线程不属于包中的基本概念的一项,其他三个都是。 16.下列关于AWT构件的说法中错误的一项是( D )。 A.Frame是顶级窗口,它无法直接监听键盘输入事件 B.对话框需要依赖于其他窗口而存在 C.菜单只能被添加到菜单栏中 D.可以将菜单添加到任意容器的某处 【解析】菜单只能添加到Applet、Frame等容器中,不能添加到任意容器的某处。 17.JPanel的默认布局管理器是( C )。 A.BorderLayout B.GridLayout C.FlowLayout D.CardLayout . . 【解析】Panel、JPanel和Applet的默认布局管理器都是FlowLayout。 18.下列说法中错误的是( B )。 A.在Windows系统下,Frame窗口是有标题、边框的 B.Frame的对象实例化后,没有大小,但是可以看到 C.通过调用Frame的setSize()方法来设定窗口的大小 D.通过调用Frame的setVisible(true)方法来设置窗口为可见 【解析】Frame的对象实例化后,没有大小,也不能看到,只有通过调用Frame的setSize()和setVisible(true)方法才能设定窗口的大小和可见性。 19.下列说法中错误的是( D )。 A.同一个对象可以监听一个事件源上多个不同的事件 B.一个类可以实现多个监听器接口 C.一个类中可以同时出现事件源和事件处理者 D.一个类只能实现一个监听器接口 【解析】一个类可以实现多个监听器接口,从而实现对多个事件的监听。 20.下列选项中不属于容器的一项是( )。 A.Window B.Panel C.FlowLayout D.ScrollPane 【解析】FlowLayout类属于布局管理器,而不属于容器。 二、编程题 1.创建一个Frame类型窗口,在窗口中添加2个不同颜色的Panel面板,每个面板中添加2个按钮构件。 【编程分析】本程序主要考察窗口、面板以及按钮的创建及布局问题。 第一步:首先定义一个主类,让该类继承Frame类。 第二步:定义该类的数据成员,包括两个Panel对象,一个长度为4的Button对象数组。 第三步:创建类的工作方法,在方法中创建各个对象、设置对象属性、布局整个界面、设置窗口大小并显示界面。 第四步:在类的main()方法中创建本类对象,从而显示整个窗口界面。 【参考程序】 import .*; import .*; public class X10_3_1 extends Frame{ Panel pn1,pn2; // 定义面板 Button[] bt = new Button[4]; // 定义按钮数组 public static void main(String[] args)throws IOException{ new X10_3_1 (); } public X10_3_1 (){ . pn1 = new Panel(); // 创建面板对象 pn2 = new Panel(); kground(); // 设置面板背景颜色 kground(); for(int i=0; i<4; i++){ // 创建按钮对象 bt[i] = new Button("Button"+(i+1)); } . (bt[0]); // 向面板中添加按钮,面板的默认布局为FlowLayout (bt[1]); (bt[2]); (bt[3]); add(pn1,); // 向窗口添加面板,窗口默认布局为BorderLayout add(pn2,); e(300,200); // 设置窗口大小 ible(true); // 显示窗口 } } 【运行结果】 2.创建一个Frame类型窗口,采用GridLayout布局,在窗口中创建一个计算器的界面。 【编程分析】本程序主要考察布局管理问题。 第一步:创建一个主类,其中定义两个面板,一个文本框,一个二维按钮数组,一个二维字符串数组。一个构造方法、一个main()方法。 第二步:在构造方法中创建控件,实现布局。 【参考程序】 import .*; import .*; public class X10_3_2 extends Frame{ Panel pn1,pn2; // 定义两个面板 TextField tf; // 定义文本框控件 Button[][] bt = new Button[4][6]; // 定义按钮对象二维数组 String[][] str = {{"MC","7","8","9","/","sqrt"},{"MR","4","5","6","*","%"}, {"MS","1","2","3","-","1/x"},{"M+","0","+/-",".","+","="}}; public static void main(String[] args)throws IOException{ new X10_3_2(); } public X10_3_2(){ pn1 = new Panel(); // 创建面板 pn2 = new Panel(); tf = new TextField(35); // 创建文本框 (tf); . . } } out(new GridLayout(4,6)); // 设置pn2面板的布局 for(int i=0; i<4; i++){ // 创建24个按钮控件并添加到pn2面板中 for(int j=0; j<6; j++){ bt[i][j] = new Button(str[i][j]); (bt[i][j]); } } add(pn1,); // 将pn1面板添加到窗口北面 add(pn2,); //将pn2面板添加到窗口中间 le("Calculator"); // 设置窗口标题 e(300,250); // 设置窗口大小 ible(true); // 显示窗口 【运行结果】 3.创建两个Frame类型窗口,在第一个窗口中添加一个按钮,当单击按钮时打开第二个窗口,当单击两个窗口中的关闭按钮时能关闭窗口。 【编程分析】本程序主要考察窗口事件、按钮事件的实现方法。 第一步:定义一个能创建两个窗口的类TwoFrames,由于该类中的两个窗口能够关闭,并且对点击按钮有响应,因此让该类继承WindowAdapter类,并实现ActionListener接口。在类中创建两个窗口,并在第一个窗口中添加一个按钮控件;重新定义继承自WindowAdapter类的方法windowClosing(),实现关闭窗口的目的,实现ActionListener接口中的方法actionPerformed(),从而实现点击按钮时打开第二个窗口。 第二步:在主类中的main()方法中创建类TwoFrames的对象。 【参考程序】 import .*; import .*; public class X10_3_3 { // 定义主类 public static void main(String[] args) { new TwoFrames(); . . } } class TwoFrames extends WindowAdapter implements ActionListener{ // 定义窗口类 Frame fr1, fr2; // 定义两个窗口 Button bt; // 定义按钮 TwoFrames(){ // 构造方法 fr1 = new Frame("First Frame"); fr2 = new Frame("Second Frame"); bt = new Button("Open Second Frame"); ionListener(this); (bt, ); dowListener(this ); dowListener(this ); e(200, 150); e(200,150); ible(true); } public void actionPerformed(ActionEvent e){ // 处理点击按钮事件 if(rce() == bt){ ible(true); } } public void windowClosing(WindowEvent e){ (0); } } 【运行结果】 // 处理关闭窗口操作 4.编写一个能在窗口中同时响应鼠标事件和键盘事件的程序,能对鼠标的各种动作进行监听,对键盘的输入做出相应的反应。 【编程分析】本程序主要考察对鼠标、键盘事件的处理问题。 第一步:定义一个MouseKeyFrame类,该类主要有三个功能,(1)创建窗口。(2)处理鼠标事件。(3)处理键盘事件。创建窗口主要在类的构造方法中实现;处理鼠标事件主要在内部类MouseHandler中实现,该类实现了MouseListener和MouseMotionListener两个接口;处理键盘事件主要在内部类KeyHandler中实现,该类继承了Canvas类,实现了 KeyListener接口。Canvas类对象是接受键盘事件的容器,KeyListener接口中包含了处理键盘. . 事件的方法。 第二步:创建主类X10_3_4,在该类的main()方法中创建MouseKeyFrame类对象。 【参考程序】 import .*; import .*; public class X10_3_4 { // 定义主类 public static void main(String[] args) { new MouseKeyFrame(); } } class MouseKeyFrame extends Frame { // 定义创建窗口、处理鼠标和键盘事件的类 Panel pn; TextField tf1, tf2; KeyHandler kh; MouseKeyFrame(){ pn = new Panel(new BorderLayout() ); tf1 = new TextField(30); tf2 = new TextField(30); kh = new KeyHandler(new Dimension(200,80), ); (kh, ); (tf2, ); (tf1, ); (pn, ); seListener(new MouseHandler() ); seMotionListener(new MouseHandler() ); dowListener(new WindowAdapter(){ // 关闭窗口事件处理 public void windowClosing(WindowEvent e){ (0); } } ); e(400, 300); ible(true); } class MouseHandler implements MouseListener, MouseMotionListener{ // 处理鼠标事件内部类 // 以下5个方法是实现MouseListener接口中的方法 public void mouseEntered(MouseEvent e){ t("Mouse entered the frame!"); } public void mouseExited(MouseEvent e){ t("Mouse exited the frame!"); } public void mousePressed(MouseEvent e){ t("Mouse pressed in the frame!"); . . } public void mouseReleased(MouseEvent e){ t("Mouse released in the frame!"); } public void mouseClicked(MouseEvent e){ t("Mouse clicked in the frame!"); } // 以下2个方法是实现MouseMotionListener接口中的方法 public void mouseMoved(MouseEvent e){法 t("Mouse moved in the frame!"); } public void mouseDragged(MouseEvent e){ t("Mouse dragged in the frame!"); } } class KeyHandler extends Canvas implements KeyListener{// 处理键盘事件内部类 StringBuffer sb ; KeyHandler(Dimension d, Color c){ sb = new StringBuffer(); e(d); kground(c); Listener(this); } public void keyPressed(KeyEvent e){ } public void keyReleased(KeyEvent e){ } public void keyTyped(KeyEvent e){ t("" + (Char()) ); repaint(); } public void paint(Graphics g){ ring("" + sb, 10, 20); } } } 【运行结果】当鼠标进入窗口(上面白色区域)时,将在上面的文本框中显示鼠标动作,当用鼠标点击画布(下面有色区域)使画布获得焦点后,即可以用键盘输入数据,输入的数据在画布和下面的文本框中同时显示。如下图: . . .


发布评论