首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

求高手给解!java绘图,鼠标点击可以移动,怎么刷新图像而不是添加?

2012-02-21 
求高手给解!!java绘图,鼠标点击可以移动,如何刷新图像而不是添加???下面是全部代码,移动后是添加移动的图

求高手给解!!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));        } 

热点排行