2013-03-26 71 views
1

给出下面的代码:不能在Java中创建多个多边形 - 只有一个

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.util.ArrayList; 
import java.util.Iterator; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


/** 
* 
* @author X2 
* 
*/ 
public class PolygonnerJframe 
{ 
    public static void main (String[] args) 
    { 
    JFrame frame = new JFrame("Draw polygons"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(new DrawingPanel()); 
    frame.pack(); 
    frame.setVisible(true); 
} 
} 




/** 
* Main class 
* @author X2 
* 
*/ 
class DrawingPanel extends JPanel implements MouseListener, MouseMotionListener 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private static final Dimension MIN_DIM = new Dimension(300, 300); 
    private static final Dimension PREF_DIM = new Dimension(500, 500); 
    private boolean polygonDone = false; 
    private final Point trackPoint = new Point(); // The 'dummy' point tracking the mouse 
    private ArrayList<Point> points = new ArrayList<Point>(); // The list of points making up a polygon 
    private ArrayList<Point> helper = new ArrayList<Point>(); // The list of points making up a polygon 


    public ArrayList<Point> copyCreate(ArrayList<Point> input , ArrayList<Point> output) 
    { 
     int i = 0; 
     if (output == null) 
      output = new ArrayList<Point>(); 
     while (i < input.size()) 
     { 
      output.add(input.get(i)); 
      i++; 
     } 
     return output; 
    } 




    /** 
    * Setting the dimensions of the windows 
    */ 
    public Dimension getMinimumSize() { return MIN_DIM; } 

    public Dimension getPreferredSize() { return PREF_DIM; } 



    /** 
    * The only constructor needed for this class 
    */ 
    DrawingPanel() 
    { 
     super(); 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 



    /** 
    * The drawing itself 
    */ 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     int numPoints = points.size(); 
     if (numPoints == 0) 
      return; // nothing to draw 


     Point prevPoint = (Point) points.get(0); 

     // draw polygon 
     Iterator<Point> it = points.iterator(); 
     while (it.hasNext()) 
     { 
      Point curPoint = (Point) it.next(); 
      draw(g, prevPoint, curPoint);   
      prevPoint = curPoint; 
     } 

     // now draw tracking line or complete the polygon 
     if (polygonDone == true) 
     { 
      draw(g, prevPoint, (Point) points.get(0)); 
     } 

     else // polygonDone == false 
      draw(g, prevPoint, trackPoint); 

    } 





    /** 
    * MouseListener interface 
    */ 
    public void mouseClicked(MouseEvent evt) 
    { 
     int x = evt.getX(); 
     int y = evt.getY(); 

     switch (evt.getClickCount()) 
     { 
      case 1: // single-click 
       if (polygonDone == true) 
       { 
        this.helper = this.copyCreate(this.points, this.helper); // copy the new coordinates into the helper 
        points.clear(); 
        polygonDone = false; 
       } 
       points.add(new Point(x, y)); 
       repaint(); 
       break; 

      case 2: // double-click 
       polygonDone = true; 
       points.add(new Point(x, y)); 
       // repaint(); 
       break; 

      default: // ignore anything else 
       break; 
     } 
    } 






    /** 
    * MouseMotionListener interface 
    */ 
    public void mouseMoved(MouseEvent evt) 
    { 
     trackPoint.x = evt.getX(); 
     trackPoint.y = evt.getY(); 
     repaint(); 
    } 



    /** 
    * draw points and lines 
    * @param g 
    * @param p1 
    * @param p2 
    */ 
    private void draw(Graphics g, Point p1, Point p2) 
    { 
     int x1 = p1.x; 
     int y1 = p1.y; 

     int x2 = p2.x; 
     int y2 = p2.y; 

     // draw the line first so that the points 
     // appear on top of the line ends, not below 
     g.setColor(Color.green.darker()); 
     g.drawLine(x1 + 3, y1 + 3, x2 + 3, y2 + 3); 
     g.drawLine(x1 + 4, y1 + 4, x2 + 4, y2 + 4); 
     g.drawLine(x1 + 5, y1 + 5, x2 + 5, y2 + 5); 

     g.setColor(Color.green); 
     g.fillOval(x1, y1, 8, 8); 

     g.setColor(Color.black); 
     g.fillOval(x2, y2, 8, 8); 
    } 





    public void mouseDragged(MouseEvent evt) { /* EMPTY */ } 

    public void mousePressed(MouseEvent evt) { /* EMPTY */ } 

    public void mouseReleased(MouseEvent evt) { /* EMPTY */ } 

    public void mouseEntered(MouseEvent evt) { /* EMPTY */ } 

    public void mouseExited(MouseEvent evt) { /* EMPTY */ } 
} 

我只能得出每次一个多边形,这意味着 - 当我尝试启动一个新的多边形 “老”多边形消失,但我不明白为什么。

那么如何绘制多个多边形呢?

什么导致旧的多边形消失?我想可能是由于repaint(),但我没有尝试过,但没有帮助。

我会感激你的帮助

+0

它可能是它必须做一些行'points.clear();'?长时间没有使用画布,但我认为绘制方法实际上是针对您的显示器每帧更新而调用的,也就是说,当列表中的点不再可用时,它们不能被绘制。所以,每次你想要一个新的多边形时,你可能不得不用点来创建一个新的List。 – GameDroids 2013-03-26 23:27:39

回答

4

多边形确实被调用points.clear()擦除。为了解决这个问题,您可以使用Polygon关于先前多边形的类别,在单独的List中维护坐标信息,这些信息可以与“正在进行中”多边形一起绘制。这在Custom Painting Approaches中概述。

+0

+1,Java已经支持添加点来组成Polygon的Polygon类。所以你的列表应该包含多边形,而不是个别点。然后,您可以使用Graphics2D.draw(Shape)或fill(Shape)方法绘制多边形。 – camickr 2013-03-27 00:20:31

+0

是想到一个包装,'多边形'是完美的:) – Reimeus 2013-03-27 00:24:00

+0

@Reimeus:好的,谢谢,删除'points.clear();'和处理后果呢?我试图删除它,它确实造成了一些问题... + 1 – ron 2013-03-27 03:06:52

相关问题