我必须使用 StdDraw 在 java 中创建一个简单版本的 MS Paint。以下是要求和我的代码:
在本课程中,我们将编写一个简单的 MS Paint 类型程序,让您绘制,然后保存/加载这些绘图。您将实现 2 个类。为您提供了第三个类,Point2D.javaPreview 文档。
绘图 此类应包含 Point2D 对象的 ArrayList。这个类还应该实现 Serializable 以便我们可以保存/加载我们的绘图。它应该包括一个将点设置为空 ArrayList 的构造函数。
它还应该包括绘制所有点的方法 draw()。
它应该包括一个方法maybeAddPoint(Point2D p)。这应该添加该点,除非它与 ArrayList 中的最后一个点相同。当用户按住鼠标一段时间而不移动它时,我们不希望同一点的一堆副本。
最后,它应该包括一个清除点列表并调用 StdDraw.clear() 的方法 clear()。
驱动程序 在 main() 中,我们将创建或加载一个绘图对象,绘制它,并允许用户对其进行编辑。
程序应尝试使用 ObjectInputStream 类从文件“savedDrawing.dat”加载绘图对象。如果由于任何原因失败,您应该打印您无法打开文件并创建一个新的空白绘图对象。(提示,创建空绘图的代码可以放在 catch 块中)。
一旦你有一个绘图对象,创建一个动画循环。在循环中,您应该检查鼠标是否已按下(StdDraw.mousePressed() 或 StdDraw.isMousePressed())。如果是,请在您的绘图中添加一个新点(好吧,也许。让您的 maybeAddPoint() 方法为您决定)。您还应该接受 2 条键盘输入。如果用户按下“C”键,(提示,检查 StdDraw.isKeyPressed() 您可能需要使用 KeyEvent 类中的键码静态常量),清除绘图。如果用户点击“Q”,请跳出你的循环。
当您退出动画循环时,使用 ObjectOutputStream 类将您的绘图对象保存到“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 方法是否错误?