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);

}

}

}

【运行结果】当鼠标进入窗口(上面白色区域)时,将在上面的文本框中显示鼠标动作,当用鼠标点击画布(下面有色区域)使画布获得焦点后,即可以用键盘输入数据,输入的数据在画布和下面的文本框中同时显示。如下图:

.

.

.