在之前的文章中,我们了解和简单掌握了类和对象、继承、事件监听机制、接口的相关内容,那现在我们已经可以尝试自己写一个画图程序了\(^o^)/

那我们需要的API类有哪些?

界面类DrawFrame里

Color(为简略将包名省略,下同)(用于设置颜色);Dimension(用于设置除了顶级容器外其它组件的大小);FlowLayout(用于流布局);Graphics(用于画笔);JFrame、JButton(用于设置窗体和按钮)。

事件处理类DrawListener里

BasicStroke(用于调整画笔粗细);Graphics2D(用于画笔);Imagine(用于调用图片);RenderingHints(用于设置抗锯齿);ActionEvent、ActionListener(用于实现接口);MouseAdapter、MouseEvent(用于继承鼠标适配器);Color;Graphics。

明确了我们的目标,并理清了我们所需要的API类,我们就可以着手开动了!

\("▔□▔)/\("▔□▔)/\("▔□▔)/。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

首先定义DrawFrameX窗体类

(此处还未定义DrawListenerX事件处理类,会报错)

然后再定义DrawListenerX类

在DrawListenerX事件处理类中,我们首先定义一个setG方法,将DrawFrameX中的窗体和画笔“借用”过来:

然后思考:要如何实现识别按钮上文字的功能,如何去更改颜色呢?我们可以先定义String类属性type和Color类属性color,再于actionPerformed()方法中获取按钮上的文字信息,因为颜色按钮上是没有文字的,所以如果ac为空,则说明该按钮是颜色按钮,将按钮的背景颜色赋给color;否则将按钮上的文字赋给type。

现在开始着手实现功能。

对于几乎所有的图形,我们需要靠鼠标的按下、拖动来画出,在mousePressed()方法中

每一次需要画图时我们必然会执行将鼠标按下的动作,因此这个方法总会在开始被执行,因此可以在这个方法中写下画笔默认的属性。

在mouseReleased()方法中

(未完)

画直线和预设文字应该比较好理解,在画三角形(任意多边形)时,我们是先拖动出一条线,再通过点击达到首尾相连的效果。通过指示器,我们不仅能限制一次只能靠拖动画一条直线,还能将首次拖动的位置储存。

(上接)

这里我们需要解决一个问题,那就是如果不往右下角拖动(即x-x0与y-y0不全为正数),显示出的图形就会有问题,甚至显示不出图形。在这里我的方法是如果释放鼠标的坐标数值比按下的小,则将两者互换。

在mouseClicked()方法中

在点击的位置获取坐标,如果要画的是三角形,则直接将首尾相连并将指示器置为1;如果要画的是任意多边形,则点击位置与上一个记录的点相连,并将点击位置坐标赋给存储上一个记录点的xx、yy变量。若要结束绘制,双击。

在mouseDragged()方法中

(语句有些是冗余的,还请见谅)(实际使用中,喷漆的效果不是很好…………)

要实现曲线,思路和绘制多边形的差不多,将新得到的点的坐标数值赋给储存上一个记录点的变量。

效果图

大功告成!!当然画图程序还远远达不到预期,如何解决当将画板窗体最小化或者改变窗体大小的时候,画过的图形就消失的问题,就留到之后的文章再讨论吧!