- MouseMotionListener中发挥功能的函数是MouseDragged,我们在拖动鼠标时,可以实时地画出我们想画的图形。在实现时,需要配合MouseListener监听器中的部分代码。以画直线为例,当我们一开始按下鼠标时就会得起点的坐标(x1,y1),我们需要再得到拖动鼠标时实时的坐标(x,y),然后把第一个坐标和这个不断变化的坐标进行连线。当然,这样画出来的会是很多很多条起点相同的直线,所以还需要把除了最后一条直线以外的线用背景色擦除掉。我们用oldx,oldy来记录上一条线的坐标。代码如下:
public class ShapeListener implements MouseMotionListener
{
public void mouseMoved(MouseEvent e){}
int oldx, oldy;
public void mouseDragged(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
if(action.equals("直线"))
{
if(oldx == oldy == 0)
{
oldx = x;
oldy = y;
}
g.setColor(new Color(238, 238, 238));
g.drawLine(x1, y1, oldx, oldy);
g.setColor(color);
g.drawLine(x1, y1, x, y);
oldx = x;
oldy = y;
}
if(action.equals("矩形"))
{
if(oldx == 0 && oldy == 0)
{
oldx = x;
oldy = y;
}
g.setColor(new Color(238,238,238));
g.drawRect(Math.min(oldx, x1), Math.min(oldy, y1), Math.abs(oldx - x1), Math.abs(oldy - y1));
g.setColor(color);
g.drawRect(Math.min(x, x1), Math.min(y, y1), Math.abs(x - x1), Math.abs(y - y1));
oldx = x;
oldy = y;
}
if(action.equals("圆"))
{
if(oldx == 0 && oldy == 0)
{
oldx = x;
oldy = y;
}
g.setColor(new Color(238,238,238));
g.drawOval(Math.min(oldx, x1), Math.min(oldy, y1), Math.abs(oldx - x1), Math.abs(oldy - y1));
g.setColor(color);
g.drawOval(Math.min(x, x1), Math.min(y, y1), Math.abs(x - x1), Math.abs(y - y1));
oldx = x;
oldy = y;
}
if(action.equals("铅笔"))
{
g.drawLine(x1, y1, x, y);
x1 = x;
y1 = y;
}
}
}
- 最后在MyShapeUI中addMouseMotionListener即可。