Question

Je dessine de nombreux polygones de triangle et le stocker dans la liste chaînée. Mon problème est que, quand je stocke le dessin dans un fichier Bloc-notes, les données sont illisibles (symbole bizarre). Lorsque je tente de l'imprimer en utilisant println la sortie est comme ce java.awt.Polygon@1d6096.

Comment stocker les coordonnées du polygone dans le Bloc-notes?

... 
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");
  }
}

ÉDITÉ:

Je l'ai essayé toutes les suggestions mais je ne peux pas réussi à obtenir la sortie comme suit. Je l'ai essayé le « PrintWriter » aussi bien, mais je ne peux pas résolu le problème. Aidez-moi, s'il vous plaît, ma tête est si lourd avec ceci: - (

Je dessine les triangles, faire des changements, et le stocker dans la liste chaînée. Après le dessin terminé, et apporter des modifications, je clique sur le bouton Enregistrer et enregistrer dans Notepad.txt avec espoir que je vais obtenir la sortie dans le Bloc-notes comme ceci:

40 60 50 cette ligne représente les sommets de triangle Xs 1
40 40 50 Cette ligne représente les sommets du triangle Ys 1

60 80 70 2 triangle
60 60 70

100 120 110 3 triangle
100 100 110

Était-ce utile?

La solution

Personne ne fait affiché la façon la plus simple absolue pour ce faire, donc ici il va.

Prendre un Polygon p, la sortie d'une chaîne de caractères représentant les coordonnées x / y de p (en supposant que p a au moins 1 point) de la forme "(x1 y1, y2 x2, 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(")");

Autres conseils

Si vous voulez juste pour stocker les coordonnées, et ne veulent que d'écrire d'une manière (dans le fichier), vous devez écrire une méthode de remplacement sur votre Polygon:

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

ou quelque chose de similaire.

Bien sûr, les données sont illisibles. Il est « données », et non « Texte ». Vous devez lire à nouveau le fichier avec la classe ObjectInputStream. Utiliser la méthode `readObject (); Cette méthode retourne un objet. Bien sûr, vous devez jeter sur cette façon:

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

Je pense que vous voulez juste enregistrer le triangle de continuer à travailler avec elle après la fermeture de votre programme.

Je commence par un test.

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

Je suppose ici que vous utilisez la classe AWT Polygon. Ce test échoue, parce que la classe Polygon de AWT ne remplace pas le comportement par défaut. Mais Polygon a beaucoup de bonnes choses dans ce que vous ne voulez pas perdre (peut-être), afin d'ajouter le nouveau comportement que nous voulons (une méthode toString ()), nous allons changer cela juste un peu:

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

Ce ne compile même pas, parce que la classe Triangle n'existe pas encore. Créons (je me sers éclipse, je vais courir QuickFix pour créer la classe pour moi):

import java.awt.Polygon;

public class Triangle extends Polygon {

}

Maintenant, le test compile, mais échoue comme avant. Donc, nous allons écrire la méthode 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();
    }
}

et maintenant le test passe.

Notez que j'ai changé le format un peu de ce que vous avez demandé, parce que je pense que vous voulez sans doute être en mesure de faire la distinction entre le point (5, 17) et le point (51, 7).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top