Domanda

Vorrei attirare molti poligoni triangolo e riporlo in lista concatenata. Il mio problema è che, quando devo conservare il disegno in un file di blocco note, i dati sono illeggibili (simbolo strano). Quando provo a stamparlo utilizzando println l'uscita è come questo java.awt.Polygon@1d6096.

Come conservare le coordinate del poligono in Blocco note?

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

A CURA:

Ho provato tutti i suggerimenti, ma ancora non riesco riuscito ad ottenere l'output come il seguente. Ho provato il "PrintWriter" pure, ma smusso risolto il problema. Aiutami, ti prego, la mia testa è così pesante con questo: - (

traggo i triangoli, apportare modifiche, e riporlo in lista concatenata. Dopo disegno finito, e di apportare modifiche, clicco il pulsante Salva e salvare in Notepad.txt con speranza che mi metterò l'output in Blocco note in questo modo:

40 60 50 questa linea rappresenta vertici Xs del triangolo 1
40 40 50 questa linea rappresenta vertici Ys del triangolo 1

60 80 70 triangolo 2
60 60 70

100 120 110 triangolo 3
100 100 110

È stato utile?

Soluzione

Nessuno in realtà ha postato il modo più semplice in assoluto per fare questo, così qui va.

Dai Polygon p, uscita una stringa che rappresenta le coordinate x / y del p (supponendo p ha almeno 1 punto) del modulo "(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(")");

Altri suggerimenti

Se si desidera solo per memorizzare le coordinate, e solo voglia di scrivere in un modo (nel file), allora si dovrebbe scrivere un metodo di sostituzione sul Poligono:

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

o qualcosa di simile.

Naturalmente i dati sono illeggibili. Si tratta di "dati", non "Testo". Devi leggere nuovamente il file con la classe ObjectInputStream. Utilizzare il metodo `readObject (); Questo metodo restituisce un oggetto. Naturalmente si deve lanciare su questo modo:

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

Penso che si desidera solo per salvare il triangolo di continuare a lavorare con lui dopo la chiusura del programma.

Comincio con un banco di prova.

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

Sto assumendo qui che si sta utilizzando l'awt di classe Poligono. Questo test ha esito negativo, perché la classe Poligono di AWT non ignorare il comportamento predefinito. Ma poligono ha un sacco di roba buona in esso non si vuole perdere (forse), in modo da aggiungere il nuovo comportamento che vogliamo (un metodo toString ()), cambiamo questo solo un po ':

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

Questo non ha nemmeno compilare, perché la classe Triangolo non esiste ancora. Quindi cerchiamo di creare esso (sto usando eclissi; corro QuickFix per creare la classe per me):

import java.awt.Polygon;

public class Triangle extends Polygon {

}

E ora il test viene compilato, ma non riesce come prima. Quindi cerchiamo di scrivere il metodo 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();
    }
}

e ora il test viene superato.

Si noti che ho cambiato il formato di un po 'da quello che avete richiesto, perché penso che probabilmente vuole essere in grado di distinguere tra il punto (5, 17) e il punto (51, 7).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top