09Java第九课 在一个类中实现两个监听器

概述

在DrawUI0217类中实现按钮监听以及鼠标监听,从而实现点击不同的按钮启动不同的画图功能。之前的课实现了点击不同的按钮弹出不同的界面以及鼠标在界面中的画各种图。这节课将二者结合,首先将两个监听器放在一起,当用户点击按钮时,获取按钮上的字符串,不同字符串对应不同的图形绘制。

1 创建一个UI类,写一个界面

09Java第九课 在一个类中实现两个监听器_第1张图片

09Java第九课 在一个类中实现两个监听器_第2张图片

2. 给所有按钮添加上动作监听器

(1)创建监听UI界面的监听器类,并写好测试方法

09Java第九课 在一个类中实现两个监听器_第3张图片

(2)在UI类中创建监听器对象dl,再把监听器加到按钮上

09Java第九课 在一个类中实现两个监听器_第4张图片

执行main函数,界面弹出后点击不同按钮会显示不同结果,说明测试通过

09Java第九课 在一个类中实现两个监听器_第5张图片

3 在窗体对象上添加鼠标监听器

(1)直接在ActionListener后面加上,MouseListener

Implements后面可以接很多接口

09Java第九课 在一个类中实现两个监听器_第6张图片

(2)导入MouseListener的方法,写好测试方法体,这里就全是打印

09Java第九课 在一个类中实现两个监听器_第7张图片

MouseListener不需要再创建对象了,两个监听器公用一个对象dl。

(3)回到UI类中,把鼠标监听器加到窗体对象上

执行结果显示测试方法通过

09Java第九课 在一个类中实现两个监听器_第8张图片

4 实现画图功能

(1)在UI类中获取窗体对象上的画笔this.getGraphics();用来在窗体对象上画图

09Java第九课 在一个类中实现两个监听器_第9张图片

(2)将获取到的画笔传到监听器

(a)首先,在接口类中定义相同类型的变量Graphics g2;

g2对于接口类DrawListener0217来说,是一个属性,那么DrawListener0217的对象就可以调用这个属性,也就是dl可以调用g2了——dl.g2

09Java第九课 在一个类中实现两个监听器_第10张图片

 (b)然后,再将窗体上获得的g赋值到dl.g2——dl.g2 = g;

09Java第九课 在一个类中实现两个监听器_第11张图片

这样监听器就获取到了窗体对象上的画笔

(3)实现画画

先定义坐标int x1,x2,y1,y2;

09Java第九课 在一个类中实现两个监听器_第12张图片

对于画直线来说——

在按下mousePressed方法中获取直线的起点坐标(x1,y1)

在释放mouseReleased方法中获取直线的终点坐标(x2,y2)

09Java第九课 在一个类中实现两个监听器_第13张图片

然后用g2绘制直线 g2.drawLine(x1,y1,x2,y2);

画矩形——g2.drawRect(x1,y1,x2-x1,y2-y1);

画圆形——g2.drawOval(x1,y1,x2-x1,y2-y1);

注意这里矩形和圆的参数定义,圆是矩形的内切圆

 09Java第九课 在一个类中实现两个监听器_第14张图片

 此时在窗体上按下-拖动-释放,会同时画出直线、矩形和圆。(不需要点击按钮就可以直接画图)

09Java第九课 在一个类中实现两个监听器_第15张图片

接下来实现点击不同按钮画不同的图形

5 实现按钮监听和鼠标监听的联动

要点:根据actionPerformed方法中获取的字符串btnStr=e.getActionCommand(),利用if分支,实现功能

(1)首先定义全局变量shapeStr,获取actionPerformed方法中的局部变量btnStr

 09Java第九课 在一个类中实现两个监听器_第16张图片

 这样shapeStr就可以在下面的方法中被使用

(2)在画图前实现条件判断

09Java第九课 在一个类中实现两个监听器_第17张图片

现在点击不同的按钮就可以画不同的图形。

(3)优化

a)空指针异常.NullPointerException。原因shapeStr为空
不点击按钮,直接在窗体上画图,就会出现这个错误,因为不点击按钮不会获取按钮上的字符串,所以shapeStr是空的,也就无法在if语句中实现字符串的判断

解决方法——在定义shapeStr的时候直接赋值

09Java第九课 在一个类中实现两个监听器_第18张图片

b)对矩形绘制的优化

矩形的顶点有四个,所以对应的画法有四种,且矩形的宽高需要计算起点和终点的绝对值

09Java第九课 在一个类中实现两个监听器_第19张图片

此外,对于矩形画图时的起点以及终点也需要优化。当用户以不同的方向画矩形的时候,只要计算出坐标最小的那个点就可以确定矩形的位置。

09Java第九课 在一个类中实现两个监听器_第20张图片

6 拓展任务——三角形 

09Java第九课 在一个类中实现两个监听器_第21张图片

 09Java第九课 在一个类中实现两个监听器_第22张图片

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(开发语言,java,接口)