-2

我必须使用 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 方法是否错误?

4

1 回答 1

1

你得到一个 indexOutOfBoundsException 因为你正在访问 index points.size(),但是由于 Java 中数组的第一个索引是 0,你必须points.size() - 1访问最后一个元素。

但是你还是要检查数组是否为空,否则你会得到同样的异常。

于 2018-03-01T22:56:43.653 回答