此次仿XP画图板实现的功能有:直线、矩形、椭圆、圆角矩形、铅笔、刷子、橡皮、多边形。
现做仿XP画图板有3个面板:工具面板(ToolPanel)、画图板(DrawPanel)、颜色面板(ColorPanel)。
工具面板:
添加直线、矩形、椭圆等形状按钮,并创建动作监听器获取对按钮的动作操作
MouseListener shape_listener = new MouseListener(){
public void actionPerformed(MouseEvent e){//实现抽象方法
String command = e.getActionCommand();//获取按钮上的标记
}
}
颜色面板:
创建颜色数组利用循环添加颜色按钮,并创建颜色按钮的动作监听器对象
MouseListener color_listener = new MouseListener(){
public void actionPerformed(MouseEvent e){
JButton button = (JButton)e.getSource();//获取按钮信息
color = button.getBackground();//获取背景颜色
}
}
颜色将在鼠标按下时动态设置
g.getColor(color)
画图板:
由于画这些图形都涉及鼠标的点击和移动,就需要添加鼠标监听器和鼠标移动监听器。
MouseAdapter mouse_listener = new MouseAdapter(){
public void mouseClicked(MouseEvent e){};//监听鼠标点击操作
public void mouseDragged(MouseEvent e){};//监听鼠标拖拽操作
public void mousePressed(MouseEvent e){};//监听鼠标按下操作
public void mouseReleased(MouseEvent e){};//监听鼠标释放操作
}
画直线:
记录鼠标按下和释放时的坐标
g.drawLine(x1,y1,x2,y2);
画矩形:
记录鼠标按下和释放时的坐标,需要注意的是画矩形的方法是从矩形的左上角的坐标为起点,根据长和宽画出矩形。所以获取到坐标后需要判断这两个坐 标哪一个是矩形的左上角的坐标。
g.drawRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x2-x1),Math.abs(y2-y1));
画椭圆:
椭圆是根据其外接矩形画出的,所以其画法和画矩形一样。
画圆角矩形:
同矩形,参数多了两个:4 个角弧度的水平直径和4 个角弧度的垂直直径
g.drawRoundRect(x1,y1,x2,y2,int,int);
铅笔:
铅笔的实现是鼠标在拖拽时不断的画直线得到
public void mouseDragged(MouseEvent e){
if("pencil".equals(command)){
x2.getX();
y2.getY();
g.drawLine(x1,y1,x2,y2);
x1 = x2;
y1 = y2;
}
}
刷子:
刷子的实现就是像铅笔一样,只要将线条画的粗点即是刷子
g.setStroke(new BasicStroke(15));//画粗线条
橡皮擦:
在刷子的基础上将线条颜色规定为白色,将所画线条覆盖即是橡皮擦
g.setColor(color.white);
多边形:
第一步:设置全局计数器count,获取第一个点的坐标
public void mousePressed(MouseEvent e){
x1 = e.getX();
y1 = e.getY();
if("Polygon".equals(command)&&count==0){//保存第一个点坐标
a = x1;
b = y1;
}
}
第二步:当count=0时,鼠标拖动画出第一条直线,即画直线方法。之后每一条直线都是在鼠标点击时画出
public void MouseRelease(MouseEvent e){
x2 = e.getX();
y2 = e.getY();
if("Polygon".equals(command)){
if(count == 0)
g.drawLine(x1,y1,x2,y2);
//保存第一条直线的最后一个点坐标
x3 = x2;
y3 = y2;
count++;
}else{//画出以后的直线
g.drawLine(x3,y3,x2,y2);
//保存之后每条直线的最后一个点的坐标
x3 = x2;
y3 = y2;
}
}
第三步:画出最后一条直线
public void MouseClicked(MouseEvent e){
if("Polygon".equals(command)&&count==2)
e.drawLine(a,b,x2,y2);
}