【问题标题】:Cannot create multiple polygons in Java - only one无法在 Java 中创建多个多边形 - 只有一个
【发布时间】:2013-03-16 23:11:11
【问题描述】:

给定以下代码:

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() ,但我尝试不使用它,但它没有帮助。

感谢您的帮助

【问题讨论】:

  • 会不会和points.clear();这行有关系?很久没有使用画布了,但我认为实际上每帧更新都会调用 draw 方法,这意味着,当列表中的点不再可用时,它们就无法绘制。所以,每次你想要一个新的多边形时,你可能必须创建一个带有点的新列表。

标签: java swing jframe awt


【解决方案1】:

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

【讨论】:

  • +1,Java 已经支持 Polygon 类,您可以在其中添加点来组成 Polygon。所以你的列表应该包含多边形,而不是单个点。然后您可以使用 Graphics2D.draw(Shape) 或 fill(Shape) 方法绘制多边形。
  • @Reimeus:好的,谢谢,那么删除points.clear(); 并处理后果如何?我试图删除它,它确实造成了一些问题...+1
  • 您仍然需要调用points.clear(),但您需要创建一个新的Polygon 并添加到您的新List&lt;PolyGon&gt;,然后在绘制 之前在paintComponent 中绘制它们活动 形状。看到这个相关的example
  • @Reimeus:我正在努力,我会回到美国。非常感谢!
猜你喜欢
  • 2020-10-31
  • 2018-10-06
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2021-06-20
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多