StdDraw を使用して Java で MS Paint の単純なバージョンを作成する必要があります。要件と私のコードは次のとおりです。
このクラスでは、簡単な MS Paint タイプのプログラムを作成して、描画し、それらの描画を保存/ロードできるようにします。2 つのクラスを実装します。3 番目のクラス Point2D.javaPreview the document が用意されています。
Drawing このクラスには、Point2D オブジェクトの ArrayList が含まれている必要があります。このクラスは、図面を保存/ロードできるように Serializable も実装する必要があります。ポイントを空の ArrayList に設定するコンストラクターを含める必要があります。
また、すべてのポイントを描画するメソッド draw() を含める必要があります。
メソッド MaybeAddPoint(Point2D p) を含める必要があります。これは、ArrayList の最後のポイントと同じでない限り、ポイントを追加する必要があります。ユーザーがマウスを動かさずにしばらくマウスを押したままにしたときに、同じポイントのコピーが大量に発生することは望ましくありません。
最後に、ポイントのリストをクリアして StdDraw.clear() を呼び出すメソッド clear() を含める必要があります。
Driver main() では、Drawing オブジェクトを作成またはロードして描画し、ユーザーが編集できるようにします。
プログラムは、ObjectInputStream クラスを使用して、ファイル「savedDrawing.dat」から Drawing オブジェクトをロードしようとする必要があります。なんらかの理由で失敗した場合は、ファイルを開くことができなかったことを出力し、新しい空白の Drawing オブジェクトを作成する必要があります。(ヒント、空の図面を作成するコードは catch ブロックに入れることができます)。
描画オブジェクトを作成したら、アニメーション ループを作成します。ループでは、マウスが押されているかどうかを確認する必要があります (StdDraw.mousePressed() または StdDraw.isMousePressed())。そうである場合は、図面に新しいポイントを追加します (おそらく、多分 AddPoint() メソッドに決めさせてください)。また、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 メソッドは間違っていますか?