我必须使用StdDraw在java中创建一个简单的MS Paint版本。以下是要求和我的代码:
在本课程中,我们将编写一个简单的MS Paint类型程序,使您可以绘制,然后保存/加载这些绘图。 你将实现 2 个类。为您提供了第三个类,Point2D.java预览文档。
绘图 此类应包含 Point2D 对象的 ArrayList。 此类还应实现可序列化,以便我们可以保存/加载绘图。 它应该包含一个构造函数,该构造函数将点设置为空的 ArrayList。
它还应该包括绘制所有点的方法 draw()。
它应该包括一个方法maybeAddPoint(Point2D p)。 这应该添加点,除非它与 ArrayList 中的最后一个点相同。 我们不想要当用户按住鼠标一段时间而不移动它时同一点的一堆副本。
最后,它应该包括一个清除点列表并调用 StdDraw.clear() 的方法 clear()。
司机 在main()中,我们将创建或加载一个Drawing对象,绘制它,并允许用户编辑它。
程序应尝试使用 ObjectInputStream 类从文件"savedDrawing.dat"加载 Drawing 对象。 如果由于任何原因失败,则应打印无法打开文件并创建新的空白 Drawing 对象。 (提示,创建空绘图的代码可以放在 catch 块中)。
获得绘图对象后,创建动画循环。 在循环中,您应该检查鼠标是否关闭(StdDraw.mousePressed() 或 StdDraw.isMousePressed())。 如果是,请在绘图中添加一个新点(好吧,也许。 让你的 maybeAddPoint() 方法为您决定)。 您还应该接受 2 个键盘输入。 如果用户点击"C"键(提示,请检查 StdDraw.isKeyPressed() 您可能需要在 KeyEvent 类中使用键码静态常量),清除绘图。 如果用户点击"Q",请脱离循环。
退出动画循环时,使用 ObjectOutputStream 类将 Drawing 对象保存到"savedDrawing.dat"文件中,并打印它已保存。 如果由于任何原因失败,只需打印一条消息指示问题。 保存文件后(或由于某种原因无法保存),调用 System.exit() 结束程序。
我的绘画课:
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();
}
}
我的司机:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import edu.princeton.cs.introcs.StdDraw;
public class Driver {
public static void main(String[] args) {
ObjectInputStream in = null;
Drawing point;
Point2D draw;
try {
in = new ObjectInputStream(new FileInputStream("savedDrawing.dat"));
point = (Drawing) in.readObject();
while(true) {
draw = new Point2D(StdDraw.mouseX(), StdDraw.mouseY());
if(StdDraw.mousePressed()) {
point.maybeAddPoint(draw);
point.draw(draw);
}
if(StdDraw.isKeyPressed('C')) {
point.clear();
}
if(StdDraw.isKeyPressed('Q')) {
break;
}
in.close();
}
} catch (Exception e) {
System.out.print("Unable to open the file.");
point = new Drawing();
while(true) {
draw = new Point2D(StdDraw.mouseX(), StdDraw.mouseY());
if(StdDraw.mousePressed()) {
point.maybeAddPoint(draw);
}
if(StdDraw.isKeyPressed('C')) {
point.clear();
}
if(StdDraw.isKeyPressed('Q')) {
System.exit(0);
}
}
}
}
}
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;
}
}
我在我的 maybeAddPoint 方法中得到了一个 indexOutOfBoundsException。它说 ArrayList 的大小为 0。在此方法中实现的 Point2D 类的 equals 方法是否错误?
你会得到一个indexOutOfBoundsException,因为你正在访问索引points.size()
,但由于Java中数组的第一个索引是0,你必须得到points.size() - 1
才能访问最后一个元素。
但是您仍然必须检查数组是否为空,否则将得到相同的异常。