문제

나는 많은 삼각형 다각형을 그려 링크 된 목록에 보관합니다. 내 문제는 그림을 메모장 파일에 저장할 때 데이터를 읽을 수 없다는 것입니다 (이상한 기호). 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이 선은 삼각형의 정점 XS를 나타냅니다 1
40 40 50이 선은 삼각형의 정점을 나타냅니다 1

60 80 70 삼각형 2
60 60 70

100 120 110 삼각형 3
100 100 110

도움이 되었습니까?

해결책

아무도 실제로이 작업을 수행하는 절대적인 가장 간단한 방법을 게시 한 사람은 없습니다.

가져 가라 Polygon p, x/y 좌표를 나타내는 문자열을 출력 p (가정 p "(x1 y1, x2 y2, x3 y3, ...)의 형식의 최소 1 점)가 있습니다.

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(")");

다른 팁

코디네이트를 저장하고 싶고 파일에 한 방향으로 만 쓰고 싶다면 다각형에 재정의 메소드를 작성해야합니다.

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

또는 비슷한 것.

물론 데이터는 읽을 수 없습니다. "텍스트"가 아닌 "데이터"입니다. 파일을 다시 읽어야합니다 ObjectInputStream 수업. `readobject (); 이 메소드는 객체를 반환합니다. 물론 이런 식으로 캐스팅해야합니다.

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

프로그램을 닫은 후 삼각형을 저장하고 싶다고 생각합니다.

테스트 케이스로 시작합니다.

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 다각형 클래스를 사용하고 있다고 가정합니다. AWT의 다각형 클래스는 기본 동작을 무시하지 않기 때문에이 테스트는 실패합니다. 그러나 다각형은 당신이 잃고 싶지 않은 좋은 것들이 많기 때문에 (아마도), 우리가 원하는 새로운 동작 (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());
    }
}

삼각형 클래스가 아직 존재하지 않기 때문에 이것은 컴파일되지 않습니다. 그래서 만들어 봅시다 (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)를 구별 할 수 있기를 원하기 때문에 형식을 요청한 내용에서 약간 변경했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top