draw from arraylist

koddy013

Mitglied
Hallo,

ich möchte ein Grafik zeichnen.
Die Punkte von den Grafik habe ich in einen ArrayList gespeichert.

Dann schreibe ich eine neue Klasse "EvaluateDrawing" für die Zeichnung

Java:
public class EvaluateDrawing extends JPanel {

    protected List<Point2D>  listTopProfilRight = new ArrayList<Point2D>();

    @Override
    public void paintComponent (Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        super.paintComponent(g2d);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(1));
        g2d.setColor(Color.blue);

        for (int i=0; i<listTopProfilRight.size(); i++){
            System.out.println(listTopProfilRight.get(i));
            Line2D.Double line = (Line2D.Double)listTopProfilRight.get(i);
            g2d.draw(line);
        }
    }
}

Diese Grafik wollte ich auf einen Panel in einer GUI zeichnen. Die gesamte GUI und den Panel betrachte ich hier erstmal nicht.
Was kommt bis jetzt ist nur Fehlermeldung, wegen diese List.

Meine Frage ist:
Wie kann ich die Daten von ArrayList lesen und als Grafik zeichnen lassen? Oder muss ich diese ArrayList in eine normale Array umwandeln bevor ich zeichne?

Danke erstmal für eure Hilfe.

Liebe Gruße,
 
Hi!
Vielleicht solltest du noch dazuschreiben, wie die Fehlermeldung lautet? Dass machts den Leuten dann einfacher, den Fehler zu finden...

*grüssle*
 
Hier ist die Fehlermeldung:

Code:
found   : Point2D
required: java.awt.geom.Line2D.Double
            Line2D.Double line = (Line2D.Double)listTopProfilRight.get(i);
1 error

Und die Klasse Point2D ist wie folgt:
Java:
public class Point2D
{
    protected  double  x;
    protected  double  y;

    public  Point2D() {
    }

    protected  String  getXValueFormatted() {
        return  format(x);
    }

    protected  String  getYValueFormatted() {
        return  format(y);
    }
}
 
Nun, steht doch da, warum es nicht funktioniert: In deiner Liste sind Punkte (Point2D) gespeichert, du castet es aber auf ein Objekt vom Typ Line2D.Double.
Also entweder speicherst du in deiner Liste auch Linien, oder du musst dir eine andere Art überlegen, wie du von deinen Punkten auf Linien kommst.

*grüssle*
 
kannst du mir ein Beispiel Code geben?

Ich versuche diese Problem zu lösen aber in diesen 3 Tage finde ich kein Lösung dafür. Deswegen frage ich in den Forum.
Danke im voraus.
 
Was ich hier schreibe ist nur ein kleines Text von den gesamten Projekt.
In dem Projekt muss ich auf dem Panel mindestens 2 Grafik zeichnen.

Die Punkten dafür bekomme ich durch Lesen von einer XML-Datei und von einer TXT-Datei. (d.h. ich habe mindestens hier 2 verschiedene ArrayList)
Was frage ich hier, handelt es sich um die Punkten von den XML-Datei.
Die Klasse Point2D ist eigentlich auch was komplizierter. Aber ich kopiere hier nur was notwendig ist.

Der ArrayList ist gefüllt wie folgt:
Java:
            listTopProfilRight = buildListPoint2D(useCase, kChart.top, modBaseRadiusRightFlank);

und diese buildListPoint2D Method ist folgendes:
Java:
    protected List<Point2D>  buildListPoint2D(final int useCase, List<Point2D> listGDSPoint2D, double modBaseRadius) throws Exception
    {
        List<Point2D>  result = new ArrayList<Point2D>();

        try {
            double[]  gdsXValues = new double[GDSDataModel.POINT_COUNT];
            double[]  gdsYValues = new double[GDSDataModel.POINT_COUNT];

            for (int i = 0; i < listGDSPoint2D.size(); i++) {
                Point2D  p = listGDSPoint2D.get(i);
                gdsXValues[i] = p.x;
                gdsYValues[i] = p.y;
            }

            if (useCase == DataModel.USE_CASE_PROFILE) {
                for (int i = 0; i < GDSDataModel.POINT_COUNT; i++) {
                    gdsYValues[i] = - gdsYValues[i];
                }
                double  xInterval = gdsXValues[GDSDataModel.POINT_COUNT - 1] - gdsXValues[0];
                if (xInterval < 0.0) {
                    for (int i = 0; i < GDSDataModel.POINT_COUNT; i++) {
                        gdsXValues[i] = - gdsXValues[i];
                    }
                }
            }

            NoneParametricCubicSplineGenerator  generator = new NoneParametricCubicSplineGenerator();
            generator.initialize(GDSDataModel.POINT_COUNT, CURVE_POINT_COUNT, gdsXValues, gdsYValues);
            generator.doExecute();

            double[]  p16XValues = new double[CURVE_POINT_COUNT];
            double[]  p16YValues = new double[CURVE_POINT_COUNT];
            System.arraycopy(generator.getXOutputPoints(), 0, p16XValues, 0, CURVE_POINT_COUNT);
            System.arraycopy(generator.getYOutputPoints(), 0, p16YValues, 0, CURVE_POINT_COUNT);

            for (int i = 0; i < CURVE_POINT_COUNT; i++) {
                Point2D  p = new Point2D();
                //
                if (usage == DataModel.USAGE_DIAMETER) {
                    if (useCase == DataModel.USE_CASE_PROFILE) {
                        p.x = 2.0*Math.sqrt(p16XValues[i]*p16XValues[i]+ modBaseRadius*modBaseRadius);
                    }
                } else {
                    p.x = p16XValues[i];
                }
                //
                p.y = p16YValues[i];
                result.add(p);
            }

        } catch (Exception ex) {
            throw new  Exception(ex.getMessage());
        }
        return  result;
    }

Also wenn diese Klasse sieht zu komplex ist, kannst du mir eine einfache Beispiel geben, wie ich die Daten von ArrayList in eine Graph zeichen lassen.

Grüsse
 
Zuletzt bearbeitet:
Okay, du liest nun also eine Menge von Punkten ein...
Aber um eine Linie zu zeichen, benötigt man ja nun mindestens mal 2 Punkte. Und woher weist du, welche 2 Punkte eine Linie bilden?
Und sobald du das weist, kannst du doch aus diesen 2 Punkten ein LinieObjekt erstellen und dieses dann zeichnen lassen....

*grüssle*
 
Deswegen wird die Punkten in der Klasse Point2D in x- und y-Werte unterschieden und gespeichert.
Ich habe wie folgendes versucht zu schreiben, aber bringt auch nicht.

Java:
for (int i=0; i<listTopProfilRight.size(); i++){            
Line2D.Double line = (Line2D.Double) (listTopProfilRight.getXValueFormatted(i), listTopProfilRight.getYValueFormatted(i)) ;
g2d.draw(line);        
}

Gruss,
 
Ich glaube du verstehst a) nicht, was das casten überhaupt bedeutet. Und b) Worin de Unterschied von einer Linie und einem Punkt ist. Der Punkt hat 2 Koordinanten(x,y) und eine Linie besteht aus mindestens mal 2 Punkten.
Mach dir diese beiden Dinge doch erstmal klar, und dann überlege dir, zwischen welchen Punkten, die du da einliest, eine Linie gezeichnet werden soll.
Sonst kann ich dir da nicht weiterhelfen...

*grüssle*
 
Zurück