这个画板现在可以实现的功能包括话各种图形、铅笔、喷漆、刷子、橡皮、吸管取色这些。下面就来一步步分析下这个画板是怎么实现的吧!
一、界面的生成
各个组件部分是怎么生成的在这里我就不一一列出来了,这儿就把左侧工具栏部分的生成用代码表示一下,其它部分都相似的。

-
"font-size:
medium;">package db.xyz.DrawBoardTool; -
-
import
java.awt.BorderLayout; -
import
java.awt.Color; -
import
java.awt.Dimension; -
import
java.awt.FlowLayout; -
import
javax.swing.ImageIcon; -
import
javax.swing.JButton; -
import
javax.swing.JPanel; -
-
import
db.xyz.Listener.DrawListener; -
import
db.xyz.Listener.HelpListener; -
-
-
-
public
class DrawBoardTool extends JPanel{ -
DrawListener dListener; -
-
public DrawBoardTool(DrawListener dListener){ -
this.dListener = dListener; -
unitTools(); -
} -
-
public void unitTools(){ -
//设置工具栏布局为流式布局 -
this.setLayout(new FlowLayout()); -
//创建一个窗体对象 -
JPanel panel = new JPanel(); -
//设置布局为网格布局 -
panel.setLayout(new FlowLayout()); -
panel.setPreferredSize(new Dimension(70,300)); -
//数组存放图片位置 -
String [] tool = {"image/line.png","image/pencil.png","image/rect.png","image/frect.png","image/oval.png","image/foval.png","image/zhex.png","image/erase.png","image/penqi.png","image/brush.png","image/roundrect.png","image/xiqu.jpg"}; -
//数组存放控制命令 -
String [] command = {"line","pencil","rect","frect","oval","foval","zhex","erase","penqi","brush","roundrect","xiqu"}; -
HelpListener dl = new HelpListener(); -
for(int i = 0;i -
ImageIcon imgIcon = new ImageIcon(tool[i]); -
//创建JButton按钮对象添加图标设置大小 -
JButton button = new JButton(imgIcon); -
button.setPreferredSize(new Dimension(30,30)); -
//将按钮添加到panel上 -
panel.add(button); -
button.setActionCommand(command[i]); -
button.addActionListener(dListener); -
button.addMouseListener(dl); -
} -
JPanel panel_sel = new JPanel(); -
panel_sel.setBackground(Color.LIGHT_GRAY); -
panel_sel.setPreferredSize(new Dimension(60,80)); -
panel.add(panel_sel); -
this.add(panel); -
} -
}
-
二、监听器的添加——使画板有生命
之前关于监听器只接触过动作监听器就是ActioinListener。但这里在画图的时候需要的就是与鼠标有关监听器:MouseListener和MouseMotionListener。这两个监听器都有着自己的方法,其中MouseListener有五个方法,分别对应的操作是鼠标按下、松开、进入、移出和点击。MouseMotionListener只有一个鼠标拖动的方法。这些方法足以完成我们的画图板。
关于监听器具体怎么用就不用我说明了吧。看这些文章的都是大牛们。~我也只总结一下在设置这些监听器时容易出错的地方吧。
先来了解下画图的机制吧,就比如画直线,我们鼠标按下进行拖动,然后松开的时候屏幕上就会出现一条直线。怎么画直线的方法不需要我们自己去写,Graphics类中已经定义好了方法:drawLine(x1,y1,x2,y2);可以看出这个方法是需要传入4个参数的,分别是两个点的4个坐标,这样调用这个方法后就会在这两个点之间生成一条直线。所以分析一下我们只需要得到的就是鼠标按下开始拖动时的那个起始点的坐标以及最后松开画直线时的那个终点的坐标,就可以完成这个直线。
我们就要重写MouseListener这个接口中的方法:mousePressed和mouseReleased。
-
"font-size:
medium;">public void mousePressed(MouseEvent e) { -
String command = e.getActionCommand(); -
x1 = e.getX(); -
y1 = e.getY(); -
} -
-
public
void mouseReleased(MouseEvent e) { -
int x2 = e.getX(); -
int y2 = e.getY(); -
if(command.equals("line")){ -
//画一条直线 -
db.g.drawLine(x1,y1,x2,y2); -
}
这里还要说一下那个g是什么东西~~g说白了就是画布,就是那片白纸。我们在生成画布之后要调用一个方法:Graphics g =
dpaper.getGraphics();
这个语句的作用就是获取画布,就是为了知道我们要在哪里进行作图的。
现在这个画图板已经可以画一条直线了,与画直线类似的还有(内填充)矩形,(内填充)椭圆,圆角矩形这些,说相似但也不完全相同,有一点还是需要注意的。以画矩形为例,我们查看API中drawRect这个方法发现他也有四个参数:int
现在那些直线、矩形、椭圆这些都可以实现了。下面再总结下铅笔那一类工具的实现。
如果我们打开windows自带的画板,使用铅笔工具画一段曲线,再用放大镜来观看,就会发现:铅笔所画出的曲线其实就是一段段很短的直线连接所形成!这就给我们写铅笔的方法带来了灵感。但这里还需要用到另一个监听器:MouseMotionListener。它里面只有一个方法:MouseDragged。很显然这个方法是在鼠标拖动的时候调用。所以我们在鼠标按下的时候获取到x1,y1这初始坐标,之后每拖动一次就获取一对(x3,y3)坐标,并在这两个点之间画一段小直线,之后再把这个(x3,y3)赋给(x1,y1)作为下一段直线的初始坐标,当拖动后再来画出下一小段直线,如此往复就可以完成铅笔的功能啦!
-
"font-size:
medium;">public void mouseDragged(MouseEvent e) { -
//画铅笔 -
if(command.equals("pencil")){ -
x3 = e.getX(); -
y3 = e.getY(); -
db.g.drawLine(x1,y1,x3,y3); -
x1 = x3; -
y1 = y3; -
}

-
"font-size:
medium;">//画喷漆 -
else
if(command.equals("penqi")){ -
x3 = e.getX(); -
y3 = e.getY(); -
Random rand = new Random(); -
//使用循环,来画15个小点 -
for(int i=0;i<</SPAN>15;i++){ -
//在20个像素点的范围内随机一个值 -
int tempx = rand.nextInt(20); -
int tempy = rand.nextInt(20); -
//开始画点了 -
db.g.drawLine(x3+tempx, y3+tempy, x3+tempx, y3+tempy); -
} -
-
}
这样画图板的这些基本功能就都完成了。还有一个就是吸管取色的功能,这个再下一篇关于画图板的重绘操作时再来介绍吧!
三、让画图板靓丽起来
现在虽然各个组件的功能都已实现,但却都是黑色的,画的只有黑色的直线,黑色的矩形、椭圆……那么就要使我们可以给作图设置颜色。这个就很简单了。我们之前在界面中已经把颜色条儿给生成了,那么我们只要使一个监听器坚挺那些按钮,再通过动作命令来判断所选择的颜色,在调用setColor这个方法就可以完成了!
到现在,这个画板的基本功能就完成啦~~快来画出自己喜欢的图案吧!!