其实可以用另一个思路,比如放入一个Canvas图板,在Canvas上画一个正方形,无须重画它,只须改变Canvas的位置就能够得到拖动的效果了,用到方法
setBounds(int x,int y,int width,int height);

解决方案 »

  1.   

    TO:beyond_xiruo(希偌) 我不是要画矩形,那个程序只是用来示意,我要画一个复杂的图形,这个图形随着每一次鼠标拖动必须重画。我的问题是,每次画新的图都不会消除上一次的图形。 又:我不可以用设XOR MODE 的方法消除上一个图。因为很多的点是交叉的。(用过设XOR MODE 方法的朋友应该知道我的意思)
      

  2.   

    无论是什么复杂的图形都可以先把它画到一饿canvas上,然后改变它的位置
      

  3.   

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

  4.   

    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.*;
    import java.awt.image.*;
    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);
    }

    private BufferedImage bimg;
    public void paintComponent(Graphics g)
    {
    //movepaint(g,curx,cury);//用来消除上一次的痕迹
    super.paintComponent(g);
    Graphics gimg;
    if(bimg==null||bimg.getWidth(null)!=this.getWidth()||bimg.getHeight(null)!=this.getHeight())
    {
      bimg=new BufferedImage(this.getWidth( ),this.getHeight(),BufferedImage.TYPE_INT_RGB);
      gimg = bimg.getGraphics();
    }
    else
    {
    gimg = bimg.getGraphics();
    gimg.clearRect(0,0,this.getWidth(),this.getHeight());
    }
    paintNoFlick(gimg);
    gimg.dispose();
    g.drawImage(bimg,0,0,this);

    }
    private void paintNoFlick(Graphics g)
    {
    g.drawRect(newx,newy,25,25);
    curx=newx;
    cury=newy;
    }
    public void update(Graphics g)
    {
    paintComponent(g);
    }
    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();
    }

    }
    public void mouseClicked(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mouseMoved(MouseEvent e){}
    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;
    }
    }