一、步骤
-
新建一个包(package),在包中新建一个类DrawUI(class);
-
在DrawUI中引入一个方法showUI,接下来的设计就在这里面进行;
-
提前引入我们要用到的工具包;
-
新建一个绘图的窗体;
-
加上边界管理布局器BorderLayout(也可以加流式管理布局器java.awt.FlowLayout );
注:边界管理布局器可以实现画板与功能按键的分区
-
给窗体添加鼠标监听器;
-
首先定义事件处理类DrawMouse重写MouseListener接口:
添加监听器一定要重写MouseListener中的所有方法
注1:这几个方法分别是点击,按压,释放,进入,退出(鼠标位置不变,按下鼠标为点击,鼠标位置改变,按下鼠标为按压)
注2:双击MouseListener右键点击openDeclaration即可查看所有方法
-
然后在DrawUI中引入监听器
7.设置北区的功能区按键面板,背景色和大小可以任意设置;
注:北区面板的长是随着窗体的变化而变化,所以只需要设置宽度就可以。同理西区的宽度随着窗体的变化而变化,所以只需要设置长度就可以
8.继续设置绘画的面板,背景色和大小可以任意设置;
注:这里最好设计成中间区域的面板,这样除了刚刚设置的北区面板之外,其他区域就都是中间区域面板。
9.在中间面板绘画区域获取画笔;
10.开始设计画图程序(在DrawMouse中):
(1)画直线
运行效果:
(2)画矩形
运行效果:
但是这里能发现,这样的代码只能支持我们从左上角到右上角画,如果反过来矩形的位置就会偏移,如果想要达到像电脑自带的画图工具一样随意的画矩形,就需要找到坐标x和坐标y中的最小值,因为不管我们怎么画矩形,矩形左上角的坐标x,y值总是最小的,所以代码如下:
这样我们就可以实现往任意方向画矩形了
(3)画任意三角形
原理:先画一条线段,再取第三个点,让第三个点与线段两个端点连线
按照这个原理写出代码
但是发现运行的效果是这样的
这是因为第三次点击的时候,取的x3,y3点坐标把之前的点给覆盖住了,我们可以加上输出语句来显示取值验证一下
输出结果:
可以看到后来的(x1,y1),(x2,y2),(x3,y3)都是一样的
要解决这个问题就要设置标记flag,防止覆盖
在后面依次加上flag标记
运行效果:
二,改进
现在在程序里已经定义了画直线,矩形和三角形的程序,但却并不知道你想要画哪种图形,所以运行出来的效果是这样的
所以我们可以加入按钮来一一对应,这也是上面设置面板区域的原因,在北区功能区放置功能按钮,中间功能区作为画板
1.在北区面板上设置按钮
注:这里用的是创建数组的办法来新建按钮,这样方法更方便,避免代码繁琐。也可以用这种普通的方法来引入按钮,不过有几个按钮就要写几行这组代码。
2.在DrawMouse类中继续继承接口,一定要重写ActionListener中的所有方法(类可以继承多个接口)
引入name全局变量,让它获取按钮上的文字