2009-09-26 7 views
1

모든 삼각형을 표시하는 데 문제가 있습니다. 마우스 드래그를 사용하여 삼각형을 그립니다. 매번 새로운 삼각형을 그립니다. 이전 삼각형은 사라졌습니다. 어떻게하면 삼각형을 머무르게 할 수 있습니까? 그러면 드로잉 패널에 삼각형이 많이 생깁니 까?마우스 드래그 앤 드로우

..... 
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);   
    } 
} 
+0

사용자 정의 그림이의의 paintComponent() 메소드에없는 페인트() 메소드를 수행해야합니다. – camickr

답변

3

페인트 기능에는 그림이 표시됩니다. 현재 삼각형 변수에는 하나의 삼각형 만 저장하고 계속해서 그 변수를 대체합니다.

필요한 것은 삼각형 목록을 저장하고 매번 새로운 목록을 mouseReleased의 목록에 추가하는 것입니다. 다음은 변경 될 것입니다 :

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); 
    ... 
    } 
} 
+0

감사합니다. Zed,이게 너무 도움이되고 내 문제를 해결했습니다. – Jessy

1
Polygon triangle; 

당신은 그래서 당신은 캔버스를 칠 때마다이 하나의 다각형을 그릴거야, 하나 개의 삼각형 물체의 총계에 대한 참조를 유지한다.

솔루션의 몇 가지 :

  • Polygon 개체의 목록을 작성하고 paint를 호출 할 때 그들 모두를 그립니다. 마우스 수신기가 목록에 새 항목을 추가합니다.
  • 페인트 방법으로 BufferedImage에 다각형을 그 다음 draw the image에 그립니다. 많은 삼각형을 그릴 계획이라면 아마 더 좋은 선택이 될 것입니다.
+0

해결책 주셔서 감사합니다 :-) – Jessy

1

매우 이상하지 않습니다. 새 삼각형 그리기를 시작하자마자 덮어 쓰는 삼각형 객체가 하나 있습니다.

삼각형의 배열/목록을 만들고 그리기 루틴에서 그리게하십시오.

내 자바 수정 :

..... 
    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());   
     } 
    } 
    } 
+0

코드 주셔서 감사합니다 :-) – Jessy