Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ArrayList创建MS Paint的简单版本_Java_Arraylist_Stddraw - Fatal编程技术网

Java 使用ArrayList创建MS Paint的简单版本

Java 使用ArrayList创建MS Paint的简单版本,java,arraylist,stddraw,Java,Arraylist,Stddraw,我必须使用StdDraw在java中创建一个简单的MS-Paint版本。以下是要求和我的代码: 在本课程中,我们将编写一个简单的MS Paint类型程序,让您可以绘制这些图形,然后保存/加载这些图形。您将实现两个类。为您提供了第三个类Point2D.javaPreview文档 绘图 此类应包含Point2D对象的ArrayList。此类还应实现可序列化,以便保存/加载图形。它应该包括一个将点设置为空ArrayList的构造函数 它还应该包括绘制所有点的方法draw() 它应该包括一个方法mayb

我必须使用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()结束程序

我的绘画课:

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;
    }
}