0

我绘制了许多三角形多边形并将其存储在链接列表中。我的问题是,当我将绘图存储在记事本文件中时,数据不可读(奇怪的符号)。当我尝试使用 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”,但我无法解决问题。请帮帮我,我的头很重:-(

我绘制三角形,进行更改,并将其存储在链接列表中。完成绘图并进行更改后,我单击保存按钮并将其保存在 Notepad.txt 中,希望我能在记事本中得到如下输出:

40 60 50 这条线代表三角形 1 的顶点 Xs
40 40 50 这条线代表三角形 1 的顶点 Ys

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

实际上没有人发布绝对最简单的方法来做到这一点,所以就这样吧。

取 a Polygon p,输出一个字符串,表示 x/y 坐标p(假设p至少有 1 个点),形式为“(x1 y1, x2 y2, x3 y3, ...)”:

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 回答