0

三角形のポリゴンをたくさん描いてLinked Listに保存しています。私の問題は、図面をメモ帳ファイルに保存すると、データが読み取れないことです (奇妙なシンボル)。println を使用して印刷しようとすると、出力はこの java.awt.Polygon@1d6096 のようになります。

ポリゴンの座標をメモ帳に保存するには?

... 
java.util.List<Polygon> triangles = new LinkedList<Polygon>();
String pathname = "eyemovement.txt";
...
int[] xs = { startDrag.x, endDrag.x, midPoint.x };
int[] ys = { startDrag.y, startDrag.y, midPoint.y }; 
triangles.add(new Polygon(xs, ys,3));

...
public void actionPerformed(ActionEvent e) {
   if(e.getSource() == saveBtn){
      try {
      FileOutputStream fos = new FileOutputStream(pathname);
      ObjectOutputStream oos = new ObjectOutputStream(fos);
      oos.writeObject(triangles);
      oos.flush();
      oos.close();
      fos.close();
  }
  catch (Exception ex) {
    System.out.println("Trouble writing display list vector");
  }
}

編集:

私はすべての提案を試しましたが、それでも次のような出力を得ることができません。「Printwriter」も試しましたが、問題を解決できません。私を助けてください、私の頭はこれでとても重いです:-(

三角形を描画し、変更を加えて、Linked List に保存します。描画を終了して変更を加えたら、保存ボタンをクリックして Notepad.txt に保存し、次のようにメモ帳に出力されることを期待しています。

40 60 50 この線は三角形 1 の頂点 X を表します
40 40 50 この線は三角形 1 の頂点 Y を表します

60 80 70 三角形 2
60 60 70

100 120 110 三角形 3
100 100 110

4

4 に答える 4

2

座標を保存したいだけで、(ファイルに) 一方向のみを書き込みたい場合は、Polygon にオーバーライド メソッドを記述する必要があります。

String toString() {
  return this.x + ", " + this.y;
}

または似たようなもの。

于 2009-09-30T12:46:52.563 に答える
1

もちろんデータは読めません。「テキスト」ではなく「データ」です。ObjectInputStreamクラスでファイルを再度読み取る必要があります。メソッド `readObject(); を使用します。このメソッドはオブジェクトを返します。もちろん、次のようにキャストする必要があります。

Object o = ois.readObject(); // ois is the ObjectInputStream
List<Polygon> list = new ArrayList<Polygon>((List) o));

プログラムを閉じた後、三角形を保存して作業を続けたいだけだと思います。

于 2009-09-30T12:36:23.373 に答える
0

テストケースから始めます。

import java.awt.Polygon;

import junit.framework.TestCase;

public class PolygonTest extends TestCase {
    public void testToString() throws Exception {
        Polygon polygon = new Polygon();
        polygon.addPoint(0, 1);
        polygon.addPoint(1, 1);
        polygon.addPoint(1, 0);
        assertEquals("(0,1;1,1;1,0)", polygon.toString());
    }
}

ここでは、awt Polygon クラスを使用していると想定しています。awt の Polygon クラスはデフォルトの動作をオーバーライドしないため、このテストは失敗します。しかし、Polygon には、失いたくない (おそらく) 多くの優れた機能が含まれているため、必要な新しい動作 ( toString() メソッド) を追加するために、これを少しだけ変更してみましょう。

import java.awt.Polygon;

import junit.framework.TestCase;

public class PolygonTest extends TestCase {
    public void testToString() throws Exception {
        Polygon polygon = new Triangle();
        polygon.addPoint(0, 1);
        polygon.addPoint(1, 1);
        polygon.addPoint(1, 0);
        assertEquals("(0,1;1,1;1,0)", polygon.toString());
    }
}

Triangle クラスがまだ存在しないため、これもコンパイルされません。それでは作成してみましょう (私は eclipse を使用しています。QuickFix を実行してクラスを作成します)。

import java.awt.Polygon;

public class Triangle extends Polygon {

}

これでテストはコンパイルされますが、以前と同じように失敗します。それでは、toString() メソッドを書きましょう。

import java.awt.Polygon;

public class Triangle extends Polygon {
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("(");
        for (int i = 0; i < npoints; i++) 
            sb.append(String.format("%s,%s;", xpoints[i], ypoints[i]));
        sb.deleteCharAt(sb.length() - 1); // get rid of the final semicolon
        sb.append(")");
        return sb.toString();
    }
}

そして今、テストは合格です。

おそらく点 (5, 17) と点 (51, 7) を区別できるようにしたいので、私はあなたが要求したものからフォーマットを少し変更したことに注意してください。

于 2009-09-30T14:04:03.700 に答える
0

これを行うための最も簡単な方法を実際に投稿した人は誰もいなかったので、ここに行きます。

を取り、"(x1 y1, x2 y2, x3 y3, ...)" の形式の (少なくとも 1 つの点があると仮定して)Polygon pの x/y 座標を表す文字列を出力します。pp

System.out.print("(" + p.xpoints[0] + p.ypoints[0]);
for (int i = 0; i < p.npoints; i++) {
  System.out.print(", " + p.xpoints[i] + " " + p.ypoints[i]);
}
System.out.println(")");
于 2009-09-30T14:31:50.840 に答える