Javafx XYChart Variable in Schleife erzeugen?

dior

Bekanntes Mitglied
Hi,

ich versuche gerade ein paar Charts in einer Schleife zu erstellen.

Ohne Schleife sieht das ja so aus:

XYChart.Series series1 = new XYChart.Series();
XYChart.Series series2 = new XYChart.Series();
XYChart.Series series3 = new XYChart.Series();
XYChart.Series series4 = new XYChart.Series();
XYChart.Series series5 = new XYChart.Series();

Jetzt möchte ich in der Schleife sowas ähnliches wie unten machen (ist leider nicht richtig aber ich schreib es mal hin um zu verdeutlichen was ich eingetlich machen will)

XYChart.Series series;
for (int xy = 1; xy <= 10; xy++){
series||xy = new XYChart.Series();
}

kann mir da jemand einen Tip geben?
 
Einmal hast du 5 Variablen und einmal hast du eine Liste oder ein Array, die/das Objekte desselben Typs beinhaltet. In einer Schleife können Variablennamen nicht einfach so erstellt werden.
 
Danke für den Tipp!

so funktioniert das Perfekt:


Java:
List<String> series = new ArrayList<String>();
        for (int seriesI = 1; seriesI <=5; seriesI++)
        {
            series.add("series"+seriesI);
        }
        System.out.println("Series: " + series);
 
http://www.java-forum.org/top-fragen/62032-fragen-variablennamen.html

die Variablennamen kannst du nicht erzeugen und wichtig gleich dazu:
bei guter Verarbeitung bringt dir das auch gar nix, selbst wenn es ginge,
später müsstes du wieder automatisiert in die Chart einfügen oder ähnliches

eine einfache Liste ist besser

-----

und bei so verwandter Frage ruhig aufs vorherige Thema verlinken
http://www.java-forum.org/datenbank...-alle-werte-db-auslesen-chart-darstellen.html


edit: na gut, nun Thema schon zu Ende..,
von Listen schreibe ich dir aber schon seit Wochen 😉
 
toString() von ArrayList wird aufgerufen, worin wiederum die toString()-Methode von Objekt überschreiben wird. Deshalb funktioniert in diesem Fall die +-Konkatenation.
 
Jetzt muss ich das Thema leider nochmal aufmachen....

Liste habe ich ja auch verwendet und funktioniert für sich gesehen auch gut. (kann es wurnderbar mit println ausgebe: [Series1, Series2, Series3, ......]

aber ich kann jetzt kein neues XYChart.Series() definieren!

Wenn ich
Java:
 XYChart.Series series.get(0) = new XYChart.Series();
probiere dann kommt der Fehler: series already defined....

wie kann ich jetzt die Werte aus der List dazu verwenden entsprechend viele new XYChart.Series() zu erzeugen? :rtfm:
 
for ..
XYChart.Series s = new XYChart.Series();
s.setName(aktueller Name aus Schleife)

du brauchst für deine Series genausowenig Variablennamen wie du bei
Java:
List<String> series = new ArrayList<String>();
        for (int seriesI = 1; seriesI <=5; seriesI++)
        {
            series.add("series"+seriesI);
        }
einen Namen bzw. überhaupt eine Variable für jeden eingefügten String brauchst,
maximal würde reichen
Java:
List<String> series = new ArrayList<String>();
        for (int seriesI = 1; seriesI <=5; seriesI++)
        {
            String s = "series";
            s+= seriesI;
            series.add(s);
        }
usw.
du brauchst keine Variablen name1, name2, name3 usw.
 
da fehlen ja elementarste grundlagen im verständnis von java
Java:
List<XYChart.Series> seriesList = new ArrayList<XYChart.Series>();

for (int i = 0; i < 5; i++) {
    seriesList.add(new XYChart.Series());
}

eine liste für Series erstellen und dann soviele Series initialisieren und hizufügen wie du brauchst.
mit get(j) kansnt du sei dann benutzen

[EDIT]ups array und liste drucheinander geworfen[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
@bone2
also der Code, den du gepostet hast, macht ja auch nicht viel:
- eine leere Liste definieren und dann darüber iterieren?
- for-each-Variable 'series' und dann noch 'serie' als unbekannte typlose Variable neu mit einem Objekt befüllen, welches nicht genuzt wird?

wenn man die String-Liste miteinbezieht und sehr sehr viel ändert, dann wird vielleicht etwas draus
(edit: nun gut 😉 )
 
Hier ein Minibeispiel bzgl. Listen:

Java:
List<Integer> zufall = new ArrayList<Integer>((int) Math.pow(2, 4));
for (int i = 0; i < 16; i++) {
zufall.add((int) (Math.random() * (Integer.MAX_VALUE + 1.0)));
}
for (int i : zufall) {
System.out.println(i);
}
Collections.shuffle(zufall);
for (int i : zufall) {
System.out.println(i);
}

1: generics, Vererbung, Konstruktoraufruf mit Parameter
2: Schleifenkopf mit Initialisierung einer Variable sowie Inkrementierung
3: Aufruf Objektmethode, einmal expliziter und einmal impliziter Cast sowie Autoboxing
5: for-each-Schleife, Autounboxing
6: Kommandozeilenausgebe...
8: Aufruf statischer Klassenmethode (public static, evtl. final)
9 und 10: s.o.
 
So, schön langsam komm ich mir schon selber ziemlich dumm vor! Aber ganz versteh ich das noch immer nicht....

ich hab jetzt 3 Sachen probiert (versucht eure tipps umzusetzen)

1)

Java:
List<String> series = new ArrayList<String>();
        for (int seriesI = 1; seriesI <=5; seriesI++)
        {
            String s = "series";
            s+= seriesI;
            series.add(s);
            
        }
        System.out.println("List series: " + series.get(0));

Ergebnis:
List series: series1


2)

Java:
XYChart.Series s = new XYChart.Series();
        int diagramme = 0;
        for (diagramme = 0; diagramme<=4; diagramme++){
        s.setName(series.get(diagramme));
        System.out.println("forschleife: " + s.getName());
        }
              
        
        System.out.println(series.get(1));
        System.out.println(series.get(2));
        System.out.println(series.get(3));

Ergebnis:
forschleife: series1
forschleife: series2
forschleife: series3
forschleife: series4
forschleife: series5


3)

Java:
 List<XYChart.Series> seriesList = new ArrayList<XYChart.Series>();
 
        for (int i = 0; i < 5; i++) {
            seriesList.add(new XYChart.Series());
        }
        System.out.println("seriesList: " + seriesList);

seriesList: [Series[null], Series[null], Series[null], Series[null], Series[null]]


Das ist ja alles schön und gut, aber wie kann ich jetzt das ganze für das Chart verwenden?

Wenn ich alle Diagramme statisch erzeuge dann trage ich bei jedem einzelnen
Java:
series1.getData().setName(dat.get(0).substring(0, 10));
                series1.getData().add(new XYChart.Data( "O"+wert , row.get(anz)));
ein.

aber wenn ich jetzt z.B.:

Java:
series.get(0).getData().setName(dat.get(0).substring(0, 10));
                series.get(0).getData().add(new XYChart.Data( "O"+wert , row.get(anz)));

oder

Java:
s.get(0).setName(dat.get(0).substring(0, 10));
                s.get(0).getData().add(new XYChart.Data( "O"+wert , row.get(anz)));

probiere geht das nicht weil Fehlermeldung...


Code:
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:378)
	at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:27)
	at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:97)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: java.lang.String.setName
	at Charts.TestChartsSchleife1.start(TestChartsSchleife1.java:178)
	at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:298)
	at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:152)
	at com.sun.javafx.application.PlatformImpl$3.run(PlatformImpl.java:119)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
	at com.sun.glass.ui.win.WinApplication$2$1.run(WinApplication.java:62)
	... 1 more
Java Result: 1


Das mit den Schleifen und Listen ist ja verständlich aber das dann in das XYChart.Series zu bekommen???
Ich kann ja auch keine Variable z.B. s1 = series.getInt(0) definieren und dann sagen: XYChart.Series s1 weil die dann schon definiert ist ....


bin mitlerweile schon etwas verzweifelt weil ich denke das ist sicherlich ein so triviales Problem das jeder von euch kopfschüttelnd vor dem PC sitzt und sich denk was ist dass den für ein .....

Aber ich komm einfach nicht weiter ??? :L


(leider muss ich das machen auch wenn es meine aktuellen Fähigkeiten anscheinend weit überstigt)
 
Zuletzt bearbeitet:
Erroneous sym type: java.lang.String.setName

bei getData bekommst du einen string und versuchst auf den string setname zu machen. String hat aber keine Methode setName

poste mal mehr sourcecode. vor allem vom Series klasse und auch sonst. das problem sieht total banals aus, aber ich steig nich dahinter was du da versucht zu machen

hast du keine IDE? sowas würde dir glaube enorm helfen. du scheinst keinen plan zu haben, was deine methoden so zurückgeben und für paramter brauchen
 
beschreibe doch in ruhigen Worten was du vorhast, und was die jeweiligen Befehle dazu beitragen sollen?

und warum baust du unnötige Fehler ein, obwohl dich der Compiler direkt darauf hinweist?

> series.get(0)
soll wohl ein Series-Objekt sein,
so wie du es früher schon hattest könntest du da natürlich den Namen setzen,
> series.get(0).setName(name)
ginge,
aber was soll
> series.get(0).getData().setName(name)
bewirken?


bei
> s.get(0).setName()
ist s an sich fraglich, ist das ein Series-Objekt? was ist dann get(0), die Methode gibts ja gar nicht,
dann ist s wohl doch eher eine Liste, jetzt wirds spannend, vom welchem Typ,

damit die Fehlermeldung " Erroneous sym type: java.lang.String.setName" passt,
wäre anzunehmen dass s hier eine Liste von Strings ist?
Fragen über Fragen



dabei ist die Welt so einfach:
du willst eine Series erstellen, darin einen Namen setzen, darin einzelne Daten setzen?
->
Java:
Series s = new Series();
s.setName(nameString);
s.getData().add(Datensatz);
chart.add(s);

du willst mehrere Series in einer Schleife anlegen?
Java:
for(index 0 -5) {
  Series s = new Series(); // lokaler Variablenname, du brauchst den Index nicht im Variablenname
  s.setName(nameString);  // der Name könnte per get aus einer Liste von Namen geholt werden
  s.getData().add(Datensatz); // hier bietet sich eine innere Schleife um über irgendwo 
  // abgelegte Daten zu iterieren, aber das ist der nächste Schritt, vorher erstmal das andere schaffen
  chart.add(s); // falls nötig den Index beim Einfügen verwenden
}
jeder Befehl hat hier seinen Sinn, eine Schleife ist nötig, das Anlegen der Series dann der erste Schritt,
in einem bedacht gewählten korrekten Befehl wird der Name gesetzt usw.
 
Zuletzt bearbeitet von einem Moderator:
Jetz hab ich es kappiert 😀 .... richtig peinlich wenn ich mir jetzt ansehe wie einfach das eigentliche Problem zu lösen war! 😳


Aber, noch 2 Fragen:

die Schreibweise:
Java:
for(index 0 -5) {
kenn ich noch nicht, wie genau funkioniert das? (wenn ich das in meinen Code einbaue kommt: not a Statement)


Ich habe das jetzt mit eurer Hilfe so geschrieben:
Java:
int anz = 0;
      int wert = 9;      
      Scene scene  = new Scene(lineChart,800,600);   
      // ***********************************************************************
       while (anz <= 20) 
       {
        Series s = new Series();
        for (wert = 9; wert<=15; wert++) 
        {    
            if (anz <=6)
            { 
                System.out.println("wert O"+wert + " : " + "anz: " + anz + " : " + "db-Wert: " + row.get(anz));
                s.setName(dat.get(0).substring(0, 10));
                s.getData().add(new XYChart.Data( "O"+wert , row.get(anz)));
            } 
            if (anz <=13)
            { 
                System.out.println("wert O"+wert + " : " + "anz: " + anz + " : " + "db-Wert: " + row.get(anz));
                s.setName(dat.get(0).substring(0, 10));
                s.getData().add(new XYChart.Data( "O"+wert , row.get(anz)));
            } 
            if (anz <=20)
            { 
                System.out.println("wert O"+wert + " : " + "anz: " + anz + " : " + "db-Wert: " + row.get(anz));
                s.setName(dat.get(0).substring(0, 10));
                s.getData().add(new XYChart.Data( "O"+wert , row.get(anz)));
            } 
                anz++;
        }
        
       
        lineChart.getData().add(s);
       }
      // ***********************************************************************
     
        stage.setScene(scene);         
        stage.show();

Wie bekomme ich jetzt am einfachsten noch die if() anweisungen weg damit das alles in einem geht bzw. auch wenn ich da nicht nur 3 sondern z.B. 30 bedingungen habe?
 
Ach so, hatte ich vergessen zu schreiben.... die Werte kommen aus einer oracle db Tabelle.
es sind x Zeilen mit je 7 Spalten. Ich will für jede neue Zeile eine neue Diagrammlinie zeichnen.

alle Werte der Tabelle sind in einer list ... also bei anz<=6 werden die ersten 6 werte aus der list verwendet um die erste chartline zu zeichnen, bei anz<=13 die werte 7-13 usw.....

ist das verständlich ausgedrückt? ich hoffe
 
> wie genau funkioniert das? (wenn ich das in meinen Code einbaue kommt: not a Statement)
war eine Abkürzung für die diversen genannten for-Schleifen

----

deine Schleife ist kompliziert gebaut und wenn du die ifs weglassen würdest, ginge sie wirklich genauso,

teste doch mal
Java:
       while (anz <= 20) 
       {
        Series s = new Series();
        for (wert = 9; wert<=15; wert++) 
        {    
                System.out.println("wert O"+wert + " : " + "anz: " + anz + " : " + "db-Wert: " + row.get(anz));
                s.setName(dat.get(0).substring(0, 10));
                s.getData().add(new XYChart.Data( "O"+wert , row.get(anz)));
                anz++;
        }
bis 20 passiert da nix anders,
und so gehts auch für alle weiteren Vielfachen von 7

besser wäre aber einmal mehr, die Daten sauber zu strukturieren, je 7 kommen in eine Liste X,
dann hast du eine übergeordente Struktur von z.B 15 X (unterschiedliche X-Listen mit je 7 Einträgen)

dann wäre es ganz natürlich, eine Schleife bis 15 bzw. über die übergeordnete Struktur laufen zu lassen und eine innere Schleife über die 7 Einträge, die innere Schleife hast du ja bereits, die äußere ist unnötig kompliziert,
aber besser als gar nix
 
Echt cool!!!! wieso ist das immer so einfach und wieso denke ich da immer so komplizert??


Vielen Vielen Dank!! :toll: :applaus:


P.S.: Den Tipp mit je 7 in der liste werde ich noch umsetzen!
 

Zurück
Oben