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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ArrayList创建MS Paint的简单版本相关的知识,希望对你有一定的参考价值。

我必须使用StdDraw在java中创建一个简单版本的MS Paint。以下是要求和我的代码:

在这个类中,我们将编写一个简单的MS Paint类型程序,允许您绘制,然后保存/加载这些绘图。你将实现2个类。提供了第三个类Point2D.javaPreview文档。

绘图此类应包含Point2D对象的ArrayList。该类还应该实现Serializable,以便我们可以保存/加载我们的绘图。它应该包含一个构造函数,将点设置为空ArrayList。

它还应包括绘制所有点的方法draw()。

它应该包括一个方法maybeAddPoint(Point2D p)。这应该添加点,除非它与ArrayList中的最后一个点相同。当用户将鼠标按住一段时间而不移动它时,我们不需要同一点的一堆副本。

最后,它应该包含一个方法clear(),它清除点列表并调用StdDraw.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才能访问最后一个元素。

但您仍然需要检查数组是否为空,否则您将获得相同的异常。

以上是关于使用ArrayList创建MS Paint的简单版本的主要内容,如果未能解决你的问题,请参考以下文章

通过MS Paint保存图片时更改默认文件格式

c#当将TIFF转换为PNG时,我如何获得与使用MS Paint相同的压缩

为啥 ImageIO 不读取 BMP 文件,直到它被重新保存在 MS Paint 中?

优动漫ex版怎么下载

简易版Java ArrayList(增删改查)

优动漫paint1.6.2怎么破解