gpt4 book ai didi

java - 无法在 Java 中创建多个多边形 - 只有一个

转载 作者:行者123 更新时间:2023-11-29 03:35:45 24 4
gpt4 key购买 nike

给定以下代码:

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() 确实可以清除多边形。为了解决这个问题,您可以使用 Polygon 来维护坐标信息。在一个单独的 List 中关于以前的多边形的类,它可以与“进行中”的多边形一起绘制。这在 Custom Painting Approaches 中有概述。 .

关于java - 无法在 Java 中创建多个多边形 - 只有一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15649228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com