简单的画图程序,我在画图时记住点,重绘时在画一遍,好像不行,帮忙看看,有什么好办法?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ScribbleDemo extends JFrame {
  public ScribbleDemo() {
    // Create a PaintPanel and add it to the content pane
    getContentPane().add(new ScribblePanel(), BorderLayout.CENTER);
  }  /** Main method */
  public static void main(String[] args) {
    ScribbleDemo frame = new ScribbleDemo();
    frame.setTitle("ScribbleDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);
    frame.setVisible(true);
  }
}// ScribblePanel for scribbling using the mouse
class ScribblePanel extends JPanel
    implements MouseListener, MouseMotionListener {
  final int CIRCLESIZE = 20; // Circle diameter used for erasing
  private Point lineStart = new Point(0, 0); // Line start point
  
  Point []p1=new Point[200];
  int i=0;
  protected void paintComponent(Graphics g)
  {
   super.paintComponent(g);
    Point start=p1[0];
    Point end=new Point();
    for(int l=1;l<i;i++)
    {
     end=p1[l];
     g.drawLine(start.x,start.y,end.x,end.y);
     start=p1[l];
    }
   }
  public ScribblePanel() {
    // Register listener for the mouse event
    addMouseListener(this);
    addMouseMotionListener(this);
  }  public void mouseClicked(MouseEvent e) {
  }  public void mouseEntered(MouseEvent e) {
  }  public void mouseExited(MouseEvent e) {
  }  public void mouseReleased(MouseEvent e) {
  }  public void mousePressed(MouseEvent e) {
    lineStart.move(e.getX(), e.getY());
    p1[i]=lineStart;
    i++;
  }  public void mouseDragged(MouseEvent e) {
    // Create a Graphics object for drawing
    Graphics g = getGraphics();    if (e.isMetaDown()) { // Detect right button pressed
      // Erase the drawing using an oval
      g.setColor(getBackground());
      g.fillOval(e.getX() - (CIRCLESIZE / 2),
         e.getY() - (CIRCLESIZE / 2), CIRCLESIZE, CIRCLESIZE);
    }
    else {
      g.setColor(Color.black);
      g.drawLine(lineStart.x, lineStart.y,
        e.getX(), e.getY());
    }
    
    lineStart.move(e.getX(), e.getY());
    p1[i]=lineStart;
    i++;
    // Dispose this graphics context
    g.dispose();
  }  public void mouseMoved(MouseEvent e) {
  }
}

解决方案 »

  1.   

    在paintComponent函数里加入repaint();就可以重画了
      

  2.   

    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;public class ScribbleDemo extends JFrame {
        Image img = null;
        Graphics og = null;//just for buffer,双缓冲
        public ScribbleDemo() {
            // Create a PaintPanel and add it to the content pane
            getContentPane().add(new ScribblePanel(), BorderLayout.CENTER);
        }    public void paint(Graphics g) {
            if (og != null) {
                g.drawImage(img, 0, 0, this);
            }
        }    /** Main method */
        public static void main(String[] args) {
            ScribbleDemo frame = new ScribbleDemo();
            frame.setTitle("ScribbleDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 300);
            frame.setVisible(true);
        }// ScribblePanel for scribbling using the mouse
        class ScribblePanel extends JPanel implements MouseListener,
                MouseMotionListener {
            final int CIRCLESIZE = 20; // Circle diameter used for erasing
            private Point lineStart = new Point(0, 0); // Line start point        Point[] p1 = new Point[200];
            int i = 0;
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Point start = p1[0];
                Point end = new Point();
                for (int l = 1; l < i; i++) {
                    end = p1[l];
                    g.drawLine(start.x, start.y, end.x, end.y);
                    start = p1[l];
                }
            }        public ScribblePanel() {
                // Register listener for the mouse event
                addMouseListener(this);
                addMouseMotionListener(this);
            }        public void mouseClicked(MouseEvent e) {
            }        public void mouseEntered(MouseEvent e) {
            }        public void mouseExited(MouseEvent e) {
            }        public void mouseReleased(MouseEvent e) {
            }        public void mousePressed(MouseEvent e) {
                lineStart.move(e.getX(), e.getY());
                p1[i] = lineStart;
                i++;
            }        public void mouseDragged(MouseEvent e) {
                // Create a Graphics object for drawing
                Graphics g = getGraphics();            if (e.isMetaDown()) { // Detect right button pressed
                    // Erase the drawing using an oval
                    g.setColor(getBackground());
                    g.fillOval(e.getX() - (CIRCLESIZE / 2),
                               e.getY() - (CIRCLESIZE / 2), CIRCLESIZE, CIRCLESIZE);
                    //内存中同样缓冲------------------------------------------------
                    Dimension dim = this.getSize();
                    img = this.createImage(dim.width,dim.height);
                    og = img.getGraphics();
                    og.setColor(getBackground());
                    og.fillOval(e.getX() - (CIRCLESIZE / 2),
                               e.getY() - (CIRCLESIZE / 2), CIRCLESIZE, CIRCLESIZE);
                    //------------------------------------------------------------            } else {
                    g.setColor(Color.black);
                    g.drawLine(lineStart.x, lineStart.y,
                               e.getX(), e.getY());
                    //------------------------------------------
                    Dimension dim = this.getSize();
                    img = this.createImage(dim.width,dim.height);
                    og = img.getGraphics();                og.setColor(Color.black);
                    og.drawLine(lineStart.x, lineStart.y,
                               e.getX(), e.getY());
                    //------------------------------------------
                }            lineStart.move(e.getX(), e.getY());
                p1[i] = lineStart;
                i++;
                // Dispose this graphics context
                g.dispose();
            }        public void mouseMoved(MouseEvent e) {
            }    }
    }