سؤال

أرسم العديد من مضلع مثلث وتخزينها في قائمة مرتبطة. مشكلتي هي أنه عندما أقوم بتخزين الرسم في ملف المفكرة، فإن البيانات غير قابلة للقراءة (رمز غريب). عندما أحاول طباعته باستخدام 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");
  }
}

تحرير:

لقد جربت كل الاقتراحات ولكن لا يزال لا يمكنني إدارتها للحصول على الإخراج كما يلي. لقد جربت "كتاب الطباعة" أيضا، لكنني غير قادر على حل المشكلة. ساعدني، من فضلك، رأسي ثقيل للغاية مع هذا :-(

أرسم المثلثات، وجعل التغييرات، وتخزينها في قائمة مرتبطة. بعد الانتهاء من الرسم، وإجراء تغييرات، انقر فوق الزر "حفظ" وحفظه في notepad.txt مع أمل أن أحصل على الإخراج في المفكرة مثل هذا:

40 60 50 هذا الخط يمثل القمم XS من مثلث 1
40 40 50 هذا الخط يمثل القمم ys من مثلث 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، ...)":

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

هذا لا يجمع حتى حتى فئة المثلث غير موجودة بعد. لذلك دعونا نخلقها (أنا أستخدم الكسوف؛ سوف أركض 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