Java 使用ArrayList创建MS Paint的简单版本
我必须使用StdDraw在java中创建一个简单的MS-Paint版本。以下是要求和我的代码: 在本课程中,我们将编写一个简单的MS Paint类型程序,让您可以绘制这些图形,然后保存/加载这些图形。您将实现两个类。为您提供了第三个类Point2D.javaPreview文档 绘图 此类应包含Point2D对象的ArrayList。此类还应实现可序列化,以便保存/加载图形。它应该包括一个将点设置为空ArrayList的构造函数 它还应该包括绘制所有点的方法draw() 它应该包括一个方法maybeAddPoint(point2dp)。这将添加点,除非它与ArrayList中的最后一个点相同。当用户按住鼠标一段时间而不移动鼠标时,我们不希望看到同一点的一堆副本 最后,它应该包括一个清除点列表并调用StdDraw.clear()的方法clear() 司机 在main()中,我们将创建或加载图形对象,绘制它,并允许用户编辑它 程序应尝试使用ObjectInputStream类从文件“savedDrawing.dat”加载图形对象。如果由于任何原因失败,则应打印无法打开文件并创建新的空白图形对象。(提示,创建空图形的代码可能会进入catch块) 拥有图形对象后,创建动画循环。在循环中,您应该检查鼠标是否按下(StdDraw.mousePressed()或StdDraw.isMousePressed())。如果是,则向图形中添加一个新点(好吧,也许吧。让您的maybeAddPoint()方法为您决定)。您还应该接受两个键盘输入。如果用户点击“C”键,(提示,请使用StdDraw.isKeyPressed()检查您可能需要在KeyEvent类中使用keycode静态常量),请清除图形。如果用户点击“Q”,则中断循环 退出动画循环时,请使用ObjectOutputStream类将图形对象保存到“savedDrawing.dat”文件中,并打印它已保存。如果由于任何原因失败,只需打印一条消息,指出问题所在。文件保存后(或由于某种原因无法保存),调用System.exit()结束程序 我的绘画课:Java 使用ArrayList创建MS Paint的简单版本,java,arraylist,stddraw,Java,Arraylist,Stddraw,我必须使用StdDraw在java中创建一个简单的MS-Paint版本。以下是要求和我的代码: 在本课程中,我们将编写一个简单的MS Paint类型程序,让您可以绘制这些图形,然后保存/加载这些图形。您将实现两个类。为您提供了第三个类Point2D.javaPreview文档 绘图 此类应包含Point2D对象的ArrayList。此类还应实现可序列化,以便保存/加载图形。它应该包括一个将点设置为空ArrayList的构造函数 它还应该包括绘制所有点的方法draw() 它应该包括一个方法mayb
import java.io.Serializable;
import java.util.ArrayList;
import edu.princeton.cs.introcs.StdDraw;
public class Drawing implements Serializable{
private static final long serialVersionUID = 1L;
private ArrayList<Point2D> points;
public Drawing() {
points = new ArrayList<>(10);
}
public void draw(Point2D p) {
for(int i = 0; i < points.size() - 1; i++) {
p = points.get(i);
p.draw();
}
}
public void maybeAddPoint(Point2D p) {
if(p.equals(points.get(points.size()))) {
return;
}
}
public void clear() {
points.clear();
StdDraw.clear();
}
}
Point2D类:
import java.io.Serializable;
import edu.princeton.cs.introcs.StdDraw;
public class Point2D implements Serializable {
private static final long serialVersionUID = 1L;
private double x;
private double y;
public Point2D(double x, double y) {
this.x = x;
this.y = y;
}
public void draw() {
StdDraw.point(x,y);
}
public boolean equals(Object other) {
if(other == null) {
return false;
}
if(this.getClass() != other.getClass()) {
return false;
}
Point2D otherPoint = (Point2D)other;
return this.x == otherPoint.x && this.y == otherPoint.y;
}
}
我在MaybeadPoint方法中获得indexOutOfBoundsException。它说ArrayList的大小是0。此方法中正在实现的Point2D类的equals方法是否错误?您将获得indexOutOfBoundsException,因为您正在访问索引
points.size()
,但由于Java中数组的第一个索引是0,因此必须获得points.size()-1才能访问最后一个元素
但是您仍然需要检查数组是否为空,否则您将得到相同的异常。tl;博士如果您不知道如何使用调试器,请尝试在代码中的重要问题之后添加System.out.println(//someVariable//)
。
import java.io.Serializable;
import edu.princeton.cs.introcs.StdDraw;
public class Point2D implements Serializable {
private static final long serialVersionUID = 1L;
private double x;
private double y;
public Point2D(double x, double y) {
this.x = x;
this.y = y;
}
public void draw() {
StdDraw.point(x,y);
}
public boolean equals(Object other) {
if(other == null) {
return false;
}
if(this.getClass() != other.getClass()) {
return false;
}
Point2D otherPoint = (Point2D)other;
return this.x == otherPoint.x && this.y == otherPoint.y;
}
}