重新打印而不清除

问题描述:

我正在研究一个模仿Paint的程序。问题是当我绘制一个新形状时,先前的形状被删除。我试图评论出我的paintComponents的超级调用,它可以工作,但留下了太多的绘图。重新打印而不清除

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JOptionPane; 
import javax.swing.JPanel; 


public class Canvas1 extends JPanel{ 

    Circle c; 
    Rectangle r; 
    Line l; 
    String str; 
    int x1,x2,y1,y2; 
    Graphics g; 
    int draw; 
    int hollow=0; 
    Color cc; 


    public Canvas1(){ 

     LineListener listener = new LineListener(); 
     addMouseListener(listener); 
     addMouseMotionListener(listener); 


     setBackground (Color.white); 
     setPreferredSize (new Dimension(400, 400)); 

    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(cc); 
     if (this.draw == 1) 
     { 
      c = new Circle (x1,y1,x2,y2); 
      if (hollow == 0) 
      { 
       c.hollow = false; 
      } 
      if (hollow == 1) 
      { 
       c.hollow = true; 
      } 
      c.draw(g); 
     } 
     if (this.draw ==2) 
     { 
      r = new Rectangle (x1,y1,x2,y2); 
      if (hollow == 0) 
      { 
       r.hollow = false; 
      } 
      if (hollow == 1) 
      { 
       r.hollow = true; 
      } 
      r.draw(g); 
     } 
     if (this.draw ==0) 
     { 
      l = new Line(x1,y1,x2,y2); 
      l.draw(g); 
     } 
     if (this.draw ==3) 
     { 
      g.drawString(str, x1, y1); 
     } 

    } 
    public void update(Graphics g) { 
     paint(g); 
     } 
    private class LineListener implements MouseListener, MouseMotionListener{ 

     public void mousePressed(MouseEvent event){ 
      x1 = event.getX(); 
      y1 = event.getY(); 
      if (draw ==3) 
      { 
       str = JOptionPane.showInputDialog("Enter String"); 
       repaint(); 
      } 
     } 

     public void mouseDragged(MouseEvent event){ 
      if (draw ==1 || draw==2) 
      { 
       x2 = event.getX()-x1; 
       y2 = event.getY()-y1; 
      } 
      if (draw ==0) 
      { 
       x2 = event.getX(); 
       y2 = event.getY(); 
      } 
      repaint(); 

     } 

     public void mouseClicked (MouseEvent event) { 

     } 
     public void mouseReleased (MouseEvent event) { 
      if (draw ==1 || draw==2) 
      { 
       x2 = event.getX()-x1; 
       y2 = event.getY()-y1; 
      } 
      if (draw ==0) 
      { 
       x2 = event.getX(); 
       y2 = event.getY(); 
      } 
     } 
     public void mouseEntered (MouseEvent event) {} 
     public void mouseExited (MouseEvent event) {} 
     public void mouseMoved (MouseEvent event) {} 
    } 
} 

正如你已经发现,你需要调用super.paintComponent(g),否则,JPanel背景没有得到画,一切是一个烂摊子。问题是任何时候只能绘制一个形状,因为draw字段只能是单个值。一种解决方案是创建一个形状为ArrayList的图形,并在paintComponentList中绘制每个图形。

+0

谢谢,这有帮助。不能upvote – user1965206 2013-03-25 18:51:04

Custom Painting Approaches显示了这个问题的两个常见的解决方案。

一种是从列表中抽取。另一个是从BufferedImage中绘制。