tags:

views:

432

answers:

3

Hello, I have problem with displaying all the triangles. I draw a triangle using mouse drag. Everytimes I draw a new triangle, the previous triangle disappeared. How can I make the triangles stay, so there will be many triangles on the drawing panel?

.....
private class PaintSurface extends JComponent {
   Point startDrag, endDrag, midPoint;
   Polygon triangle;
   public PaintSurface() {
      this.addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
         startDrag = new Point(e.getX(), e.getY());
         endDrag = startDrag;
         repaint();
      }

      public void mouseReleased(MouseEvent e) {
         Shape r = makeRectangle(startDrag.x, startDrag.y, e.getX(), e.getY());          
         shapes.add(r); 
         if (startDrag.x > endDrag.x)
            midPoint = new Point((endDrag.x +(Math.abs(startDrag.x - endDrag.x)/2)),e.getY());
         else 
            midPoint = new Point((endDrag.x -(Math.abs(startDrag.x - endDrag.x)/2)),e.getY()); 
         int[] xs = { startDrag.x, endDrag.x, midPoint.x };
         int[] ys = { startDrag.y, startDrag.y, midPoint.y };          
         triangle = new Polygon(xs, ys, 3);               
         startDrag = null;
         endDrag = null;
         repaint();
        }
     });

     this.addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseDragged(MouseEvent e) {
           endDrag = new Point(e.getX(), e.getY());
           repaint();
        }
     });
  }

  public void paint(Graphics g) {
     Graphics2D g2 = (Graphics2D) g;
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     paintBackground(g2);
     Color[] colors = { Color.YELLOW, Color.MAGENTA, Color.CYAN , Color.RED, Color.BLUE, Color.PINK};
     int colorIndex = 0;
     g2.setStroke(new BasicStroke(1));
     g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f));
     g2.fillPolygon(triangle);        
     }
}
+3  A: 

What you see on the screen is what you draw in your paint function. Currently you only store one triangle in your triangle variable constantly replacing and drawing it.

What you need is to store a list of triangles, and add a new one each time to the list in mouseReleased. Here is what to be changed:

private class PaintSurface extends JComponent {
   ...
   //Polygon triangle;
   List<Polygon> triangles = new LinkedList<Polygon>();
   ...

   public PaintSurface() {

      public void mouseReleased(MouseEvent e) {
         ...
         //triangle = new Polygon(xs, ys, 3);
         triangles.add( new Polygon(xs, ys, 3); );
         ...
        }
     });
     ...
  }

  public void paint(Graphics g) {
     ...
     //g2.fillPolygon(triangle);
     for (Polygon triangle : triangles) g2.fillPolygon(triangle);
     ...
   }
}
Zed
Thanks Zed, this is so helpful and solved my problem.
Jessy
+1  A: 
Polygon triangle;

You keep a reference to a grand total of one triangle objects, so every time you repaint the canvas you'll draw this one polygon.

A couple of solutions:

  • Create a list of Polygon objects and draw them all when paint is called. Your mouse listener would add a new entry to the list.
  • Draw your polygons onto a BufferedImage and then draw the image in the paint method. This would probably be the better option if you plan on drawing many triangles.
McDowell
Thanks for the solutions :-)
Jessy
+1  A: 

Not very strange. You have one triangle object which you overwrite as soon as you start drawing a new triangle.

Create an array/list of triangles and have your drawing routine draw that.

My java modification:

.....
  private class PaintSurface extends JComponent {
     Point startDrag, endDrag, midPoint;
     List triangles = new ArrayList();
     public PaintSurface() {
        this.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
           startDrag = new Point(e.getX(), e.getY());
           endDrag = startDrag;
           repaint();
  }

  public void mouseReleased(MouseEvent e) {
     Shape r = makeRectangle(startDrag.x, startDrag.y, e.getX(), e.getY());          
     shapes.add(r); 
     if (startDrag.x > endDrag.x)
        midPoint = new Point((endDrag.x +(Math.abs(startDrag.x - endDrag.x)/2)),e.getY());
     else 
        midPoint = new Point((endDrag.x -(Math.abs(startDrag.x - endDrag.x)/2)),e.getY()); 
     int[] xs = { startDrag.x, endDrag.x, midPoint.x };
     int[] ys = { startDrag.y, startDrag.y, midPoint.y };          
     Polygon triangle = new Polygon(xs, ys, 3);            
     traingles.add(triangle);
     startDrag = null;
     endDrag = null;
     repaint();
    }
 });

 this.addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent e) {
       endDrag = new Point(e.getX(), e.getY());
       repaint();
    }
 });
  }

  public void paint(Graphics g) {
       Graphics2D g2 = (Graphics2D) g;
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
       paintBackground(g2);
       Color[] colors = { Color.YELLOW, Color.MAGENTA, Color.CYAN , Color.RED, Color.BLUE, Color.PINK};
       int colorIndex = 0;
       g2.setStroke(new BasicStroke(1));
       g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f));
       Iterator iter = triangles.iterator();
       while( iter.hasNext() ) {
          g2.fillPolygon((Polygon)iter.next());        
       }
  }
  }
Thanks for the code :-)
Jessy