repaint()方法,不要覆盖update(Graphics g)方法

解决方案 »

  1.   

    vc里面的Invalidate()是置窗口无效,然后自动重画的。java里面的repaint()和他的功能相同。
      

  2.   

    TO:回复人: kofwr(搭补流二)
    在MouseDraged中吗?老大,我试过的,没用,但也不报错。
      

  3.   

    To 各位老大,多谢指导,可是问题还是未能解决。 TO:回复人: fastmask(我心烦) ( ) 信誉:100
    既然这样,我的程序中根本不要MOVEPAINT,可实际上不要不行。  
    TO: 回复人: Philip1314(勇敢的心) ( ) 信誉:100  
    我这样试过,不行的。
      

  4.   

    TO老大们:以下是我抄谁的代码:运行结果为:拖动矩形,留下所有拖动痕迹。恢复注释部分,拖动矩形看到轨迹,但不会留下痕迹。UPDATE是用来消除闪烁,其实由于图太简单,可以不用。
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseEvent;
    import java.io.*;
    import java.util.*;public class MyGame
    {
    public static void main(String[] args)
    {
    JFrame mygame=new MyGameFrame();
    mygame.show();
    }
    }class MyGameFrame extends JFrame
    {

    MyPanel MyPanelObject=new MyPanel();
    public MyGameFrame()
    {
    setTitle("拖动测试·");
    setSize(600,400);
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    dispose();
    System.exit(0);
    }
    });
    Container contentPane=getContentPane();
    contentPane.add(MyPanelObject);
    }
    }
    class MyPanel extends JPanel implements MouseMotionListener, MouseListener
    {
    public static int curx=10,cury=10,newx,newy;
    private Point lastPoint;
    public MyPanel()
    { addMouseMotionListener(this);
    addMouseListener(this);
    }

    public boolean isFocusTraversable()
    {
    return(true);
    }

    public void update(Graphics g)
    { //super.paint(g);
    //paint(g);
    }

    public void paint(Graphics g)
    {
    //movepaint(g,curx,cury);
    g.drawRect(newx,newy,25,25);
    curx=newx;
    cury=newy;
    }

    private void movepaint(Graphics g,int x,int y)
    { if(lastPoint==null)
    return;
    g.setXORMode(this.getBackground());
    g.setColor(Color.black);
    g.drawRect(x,y,25,25);
    }
    public void mouseDragged(MouseEvent e)
    {
    //System.out.println("Dragged");
    if(binside)
    {
    newx = newx + e.getX()-lastPoint.x;
    newy = newy + e.getY()-lastPoint.y;
    lastPoint=e.getPoint();
    invalidate();
    repaint();
    }

    }

    boolean binside;
    public void mousePressed(MouseEvent parm1) 
    {
        if(isInsideObject(parm1.getPoint()))
    lastPoint=parm1.getPoint();
    }
    private boolean isInsideObject(Point pt)
    {
    int cx=newx+25/2;
    int cy = newy+25/2;
    int xdif=pt.x-cx;
    int ydif=pt.y-cy;
    double fdis=xdif*xdif+ydif*ydif;
    fdis=Math.sqrt(fdis);
    if(fdis>25/2)
    binside= false;
    else
    binside=true;
    return binside;
    }
    }
      

  5.   

    你用了Swing就不用写Update,它本身就是buffer了,你写这些函数都是为了最终的重画,最起码要写在repaint()里面...让后validate,在paint就好了..
      

  6.   

    to kofwr():Sorry,我弱智,不太明白。是否是说,更改绘图的逻辑运算要放在REPAINT中,然后在MOUSEDRAGGED中先调用validate,再调用Repaint?
    能否给我改一下以上的例子呢?不要movepaint的。先谢了!
      

  7.   

    兄弟们,我发觉我是头猪,用一个clearRect()就可以解决问题。给分罗~~~