日期:2014-05-20  浏览次数:20958 次

求高手给解!!java绘图,鼠标点击可以移动,如何刷新图像而不是添加???
下面是全部代码,移动后是添加移动的图像,而不是刷新原来的图像!这可怎么解决啊???
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class MoveQuad extends JFrame
{
public MoveQuad() //生成窗口
{
setBounds(100,50,400,400);
getContentPane().add(pane=new CurvePane()); //添加绘图面板
setVisible(true);
}
public static void main(String[] all)
{
new MoveQuad();
}

//鼠标监听类
static class MoveAction extends MouseInputAdapter
{
public void mousePressed(MouseEvent e) //按下鼠标
{
if(circle.contains(e.getX(),e.getY())) //鼠标在圆圈内单击
move=control; //让move指向control,来改变control坐标
}
public void mouseDragged(MouseEvent e)
{
if(move!=null)
{
move.setLocation(e.getX(),e.getY()); //move设置成鼠标位置坐标
pane.repaint(); //重新绘制面板曲线
}
}
public void mouseReleased(MouseEvent e)
{
move=null; //松开鼠标,move指向null
}
static Point2D.Double move=null;
}

//绘图面板类
class CurvePane extends JPanel
{
public CurvePane() //构造器,实现设置二次曲线quad参数,并添加鼠标监听
{
quad=new QuadCurve2D.Double(p1.x,p1.y,control.x,control.y,p2.x,p2.y);
addMouseListener(new MoveAction());
addMouseMotionListener(new MoveAction());
}
public void paint(Graphics g) //绘图
{
Graphics2D g2D=(Graphics2D)g;
circle=new Ellipse2D.Double(control.x-rad,control.y-rad,2*rad,2*rad); //绘制圆圈circle
quad.ctrlx=control.x; //重新设定二次曲线控制点坐标
quad.ctrly=control.y;
g2D.setColor(Color.blue);
g2D.draw(quad); //绘制二次曲线
g2D.setColor(Color.red);
g2D.draw(circle); //绘制圆圈circle
g2D.setColor(Color.green);
g2D.draw(new Line2D.Double(control,p1)); //绘制切线
g2D.draw(new Line2D.Double(control,p2));

}
}

static Point2D.Double p1=new Point2D.Double(40,40); //二次曲线起始点
static Point2D.Double p2=new Point2D.Double(260,70); //终点
static Point2D.Double control=new Point2D.Double(180,260); //控制点
static QuadCurve2D.Double quad; //定义二次曲线
static int rad=10; //圆圈circle半径
static Ellipse2D.Double circle;
static CurvePane pane; //定义绘图面板
}

------解决方案--------------------
public void paint(Graphics g) // 绘图
{
g.clearRect(0, 0, this.getWidth(), this.getHeight());
Graphics2D g2D = (Graphics2D) g;
circle = new Ellipse2D.Double(control.x - rad, control.y - rad,
2 * rad, 2 * rad); // 绘制圆圈circle
quad.ctrlx = control.x; // 重新设定二次曲线控制点坐标
quad.ctrly = control.y;
g2D.setColor(Color.blue);
g2D.draw(quad); // 绘制二次曲线
g2D.setColor(Color.red);
g2D.draw(circle); // 绘制圆圈circle
g2D.setColor(Color.green);
g2D.draw(new Line2D.Double(control, p1)); //绘制切线
g2D.draw(new Line2D.Double(control, p2));

}
------解决方案--------------------
你重载的那个CurvePane面板的paint方法没有调用父类的paint也没有清空原来的界面,所以导致原来的线条一直保留在面板上,所以有两个思路
第一,调用super.paint()方法清空原来界面,后面逻辑一样
第二,可以自己清空原来面板,后面一样。

第一种的解决方案的CurvePane就是在paint方法加了一行代码super.paint(g); 我这里已经正常了,你看看
Java code
public void paint(Graphics g)     //绘图
        {
            super.paint(g);//添加了这一行代码,清空原来面板的线条
            Graphics2D g2D=(Graphics2D)g;
            circle=new Ellipse2D.Double(control.x-rad,control.y-rad,2*rad,2*rad);     //绘制圆圈circle
            quad.ctrlx=control.x;     //重新设定二次曲线控制点坐标
            quad.ctrly=control.y;
            g2D.setColor(Color.blue);
            g2D.draw(quad);     //绘制二次曲线
            g2D.setColor(Color.red);
            g2D.draw(circle);     //绘制圆圈circle
            g2D.setColor(Color.green);
            g2D.draw(new Line2D.Double(control,p1));     //绘制切线
            g2D.draw(new Line2D.Double(control,p2));

        }