2013-05-07 71 views
0

我在这个java代码中有问题。 我想制作一个画家程序,但每当我选择一个形状并绘制它时,之前绘制的所有形状都与此形状相同。这是代码。 我知道问题出自paintComponent中的for语句,但是我可以用什么替换它?Java画家程序绘制形状

class inner extends JPanel implements MouseListener,MouseMotionListener{ 
     private int oldx,oldy,newx,newy; 
     private Point point1,point2; 
     private Shape newRec,line1; 
     Rectangle currRec; 
     private Vector shape; 
     private boolean status,status1; 
     private int count=0; 
     private Object line; 
     inner(){ 
      point1=point2=new Point(0,0); 
      shape = new Vector(); 
      addMouseListener(this); 
      addMouseMotionListener(this); 
     } 

     public void mouseDragged(MouseEvent event) { 

      point2=event.getPoint(); 
      newx = point2.x; 
      newy = point2.y; 
      if(Universal==7){ 
      line = new Object(oldx,oldy,newx,newy); 
      status = true; 
      repaint(); 
      } 


      currRec = new Rectangle(Math.min(point1.x,point2.x),Math.min(point1.y,point2.y),Math.abs(point1.x-point2.x),Math.abs(point1.y-point2.y)); 
      status = true; 
      repaint(); 

     } 

     @Override 
     public void mouseMoved(MouseEvent arg0) {} 
     public void mouseClicked(MouseEvent arg0) {}     
     public void mouseEntered(MouseEvent arg0) {} 
     @Override 
     public void mouseExited(MouseEvent arg0) {} 


     public void mousePressed(MouseEvent event) { 

      point1=event.getPoint(); 
      oldx=event.getX(); 
      oldy=event.getY(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent event) { 

      point2=event.getPoint(); 
      newx=event.getX(); 
      newy=event.getY(); 
      //count++; 


     if(Universal==7){ 
       line1 = new Shape(point1.x,point1.y,point2.x,point2.y); 
       shape.add(line1); 
       //Graphics g = getGraphics(); 
       //g.setColor(colour); 
       //g.drawLine(point1.x,point1.y,point2.x,point2.y); 

       count++; 
       repaint(); 
      } 
     else if(Universal==1||Universal==2||Universal==3||Universal==4||Universal==5||Universal==6){ 
       newRec = new Shape(Math.min(point1.x,point2.x),Math.min(point1.y,point2.y),Math.abs(point1.x-point2.x),Math.abs(point1.y-point2.y)); 
       shape.add(newRec); 
       count++; 
       repaint(); 
      } 
     } 

    ///// the problem is in here  
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      Shape c; 
      g.setColor(colour); 
      for(int i=0;i<shape.size();i++){ 
       c = (Shape) shape.get(i); 

      if(Universal==1){ 

       g.drawRect(c.x, c.y, c.w, c.h); 
       if(status){ 
        g.drawRect(currRec.x, currRec.y, currRec.width, currRec.height); 
       } 
      } 

      if(Universal==2){ 
       g.fillRect(c.x, c.y, c.w, c.h); 

       if(status){ 
        g.fillRect(currRec.x, currRec.y, currRec.width, currRec.height); 

       } 
      } 

      if(Universal==3){ 
       g.drawRoundRect(c.x, c.y, c.w, c.h, c.w/4, c.h/4); 

       if(status){ 
        g.drawRoundRect(currRec.x, currRec.y, currRec.width, currRec.height,currRec.width/4,currRec.height/4); 

       } 
      } 

      if(Universal==4){ 
       g.fillRoundRect(c.x, c.y, c.w, c.h, c.w/4, c.h/4); 

       if(status){ 
        g.fillRoundRect(currRec.x, currRec.y, currRec.width, currRec.height,currRec.width/4,currRec.height/4); 

       } 
      } 

       if(Universal==5){ 

        g.drawOval(c.x, c.y, c.w, c.h); 

        if(status){ 
         g.drawOval(currRec.x, currRec.y, currRec.width, currRec.height); 
        } 
       } 

       if(Universal==6){ 

        g.fillOval(c.x, c.y, c.w, c.h); 

        if(status){ 
         g.fillOval(currRec.x, currRec.y, currRec.width, currRec.height); 
        } 
       } 

       if(Universal==7){ 

        g.drawLine(c.x, c.y, c.w, c.h); 

        if(status){ 
         g.drawLine(line1.x, line1.y, line1.w,line1.h); 
        } 
       } 

       if(Universal==8){ 
        shape.clear(); 
       } 
      } 
     } 
+0

什么是通用? – arynaq 2013-05-07 19:25:36

+1

你可能想看看这个只画多边形的[答案](http://stackoverflow.com/a/16246610/928711),但它不会很复杂,以适应绘制其他形状 – 2013-05-07 19:37:24

回答

1

Universal只会在任何给定的时间成为给定的值。

涂料不累积,它们是破坏性的。

也就是说,每次调用paintComponent时,以前的所有内容都会被删除/清除干净,并且您需要“重新绘制”内容。

而不是依靠一个单一的标志,你应该添加Shape s到某种List并重新绘制所有时,当调用paintComponent。同样,你可以简单地添加“类型”(int)的List和过程,对每个列表重绘

看看Painting in AWT in Swing的烤漆工艺

1

的说明,请参见Custom Painting Approaches为两种不同的方式做到这一点:

  1. 添加形状的列表,然后重新绘制所有列表中的形状,每次的paintComponent()被调用。

  2. 将图形绘制到BufferedImage上,然后只是在调用paintComponent()时重新绘制图像。

这两个示例都没有完全符合您的要求,它只显示您的方法。