我绘制了许多三角形多边形并将其存储在链接列表中。我的问题是,当我将绘图存储在记事本文件中时,数据是不可读的(奇怪的符号)。当我尝试使用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 triangle 3
100 100 110
答案 0 :(得分:2)
如果你只想存储坐标,并且只想写一种方式(进入文件),那么你应该在你的Polygon上写一个覆盖方法:
String toString() {
return this.x + ", " + this.y;
}
或类似的东西。
答案 1 :(得分:1)
当然数据不可读。它是“数据”,而不是“文本”。您必须使用ObjectInputStream
类再次读取该文件。使用方法`readObject();此方法返回一个Object。当然你必须以这种方式施展它:
Object o = ois.readObject(); // ois is the ObjectInputStream
List<Polygon> list = new ArrayList<Polygon>((List) o));
我认为您只想在关闭程序后保存三角形以继续使用它。
答案 2 :(得分: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)。
答案 3 :(得分:0)
实际上没有人发布绝对最简单的方法,所以就这样了。
取一个Polygon p
,输出一个表示p
(假设p
至少有1个点)的x / y坐标的字符串“(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(")");