使用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的简单版本的主要内容,如果未能解决你的问题,请参考以下文章
c#当将TIFF转换为PNG时,我如何获得与使用MS Paint相同的压缩