-2

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 メソッドは間違っていますか?

4

1 に答える 1