# String Array nacheinander ausgeben



## iTobi (21. Aug 2009)

HI, ich hab wieder mal ein schul-projekt am laufen, und bräuchte dringends hilfe, danke schonma im vorraus dafür

Also es geht um folgendes: wir müssen eine "Seesimulation" schreiben, es geht dabei darum den Schmutzgehalt eines sees zu bestimmen und im laufe eines simulationszeitrraums explizit angeben.

Als Beispiel: wir haben einesn See, er 150 liter Volumen (sehr sher großer See), er hat einen zulauf,über den etwa 10 liter zufliest m, mit einem schmutzgehalt von 0% (see hat auch 0% schmutz), am see ist eine satdt , sie hat keine kläranlage und und etwa 20 liter abflussvolumen mit etwa 20 % schmutzgehalt.
in einem simulationszeitraum von, sagen wir 200 tagen, soll nun der jeweilige schmutzgehalt des sees an tag x ( von 1-200) angegeben werden.

die Berechnug ist dabei kein Problem, diese habe ich schon erfolgreich ausgetüftelt, es geht um die Ausgabe iner Liste:

zwischen den 200 berechnungen soll nämlich jeweils 2 sekunden pause sein, um java zeit zugeben ein bild, das die änderung visualisert , zu ändern.
die ausgabe soll jedoch nacheinander erfolgen, d. h. tag 1 wird ausgegeben, 2 sekunden wartezeit, tag 2 wird ausgeben,...
das problem hierbei liegt am realisieren dieser ausgabe und zwar, soll das vorherige ergebnis (von tag 1-x)  dabei weiterhin sichtbar sein.
meine versuche über arrays funktionierten nicht , da java trotz befehl in der schleife auf  das komplette füllen des arrays wartete, was ja nicht sinn der applikation ist, da könnt man sich die wartezeit ja ganz schenken.

ich hoffe es könenn einige meinem problem folgen und zur lösung beitragen

der code zeigt alle meine versuche ( die auskommenteirten )


```
// TODO hier Quelltext einfügen
    tage=Integer.parseInt(jTextField10.getText());
    Prozent= new double [tage];

    //ProzentAusgabe = new String [tage];
    
    //Vector <Object> ProzentAusage= new Vector<Object>();
    
    for(int i=1; i<= tage; i++)
    {
       double prozent=see.getSchmutzprozent();
       Prozent[i]=prozent;

//       String hilf=new String ("Tag:"+i+" "+Double.toString(Prozent[i])+"%");
//      Object hilf1 = new Object(hilf);
//       ProzentAusgabe.addElement(hilf1);

//        ProzentAusgabe[i] = "Tag:"+i+" "+Double.toString(Prozent[i])+"%" ;
     
//       ProzentAusgabe =new String[1] ;
//       ProzentAusgabe[1]="Tag:"+i+" "+Double.toString(Prozent[i])+"%";
       
       if(prozent<0.4)
       {
         jLabel1.setIcon(new ImageIcon("Bilder/SeeStadt.jpg"));
       }
       if((0.4<prozent) && (prozent<0.8))
       {
         jLabel1.setIcon(new ImageIcon("Bilder/SeeStadt4%.jpg"));
       }
       if((0.8<prozent) && (prozent<1.2))
       {
          jLabel1.setIcon(new ImageIcon("Bilder/SeeStadt8%.jpg"));
       }
       if(prozent>1.2)
       {
          jLabel1.setIcon(new ImageIcon("Bilder/SeeStadt12%.jpg"));
       }
       
       jList1.setListData(ProzentAusgabe);
       
      try {
         Thread.sleep(2000);
      }  catch (InterruptedException e){
           // the VM doesn't want us to sleep anymore,
           // so get back to work
         }

    }
```


----------



## Leroy42 (21. Aug 2009)

iTobi hat gesagt.:


> meine versuche über arrays funktionierten nicht , da java trotz befehl in der schleife auf  das komplette füllen des arrays wartete



Vermutlich wird dein Code innerhalb des EDT's aufgerufen
(zum Beispiel) innerhalb des action-Listeners eines Buttons.

In diesem Fall machen sich Änderungen an der GUI
erst nach Beendigung der gesamten Mehode aus.

In diesem Fall mußt du einen eigenen Thread starten
der dann auch die Wartezeit ausführt.


----------



## iTobi (21. Aug 2009)

hättest du vielleicht ein Beispiel? Ich habe erst seit 2. Jahren Informatik mit Java, und mit den genauen Begriffen und Bezeichnugen, bzw. "erweitertem" programmieren haben wir noch nicht angefangen. Dein post klingt Logisch, aber ich kann halt nich wirklich viel damit anfangen, aslo wäre eine genauere Erläuterung sehr lieb

bittedankeschön


----------



## Schandro (21. Aug 2009)

um Code in einen eigenen Thread auszuführen:

```
new Thread(new Runnable(){
            public void run(){            
                  // hier Code einfügen
            }
        }).start();
```
pack einfach mal deinen ganzen Code den du oben gepostet hast da rein.

Falls Leroy24' (und meine) Vermutung falsch ist und das hier nichts hilft, poste mal deinen gesamten Code.


----------



## iTobi (22. Aug 2009)

superklasse

ein fettes fettes dankeschön, das funkts echt prima, und das bild ändert sich auch, damit ihr euch vorstellen könnt was die applikation jetzt macht, hänge ich sie euch an, ihr könnt ja ma schauen (aber bitte nich all zuweit verbreiten, oder schmu damit treiben xD), wer ideen oder anregungen hat, immer her damit

Die Bilder sind leider alle nötig, ansonsten funktioniert die visuelle darstellung nicht, sie müssen in einen ordner "bilder" im gleichen verzeichnis wie die.jar datei
ebenfalls wichtig ist es, möglichst logische parameter zuwählen


----------



## iTobi (22. Aug 2009)

ob das einfach so, ohne die nötigen classen funktioniert kann ich euch nicht sagen, wenn nich sry

und es wäre lieb wenn mir jemand die lösung noch erklären könnte, bzw. was der unterschied zwischen diesem thread und meiner version war


----------



## Schandro (22. Aug 2009)

iTobi hat gesagt.:


> und es wäre lieb wenn mir jemand die lösung noch erklären könnte, bzw. was der unterschied zwischen diesem thread und meiner version war


Den Code denn du ganz oben gepostet hast hast du innerhalb eines bestimmten GUI-Events ausgeführt, z.b. dadurch das der Benutzer nen Button drückt, ne Taste drückt oder was auch immer. Für diese GUI-Events ist der EDT (Event Dispatcher Thread) zuständig. GLEICHZEITIG dazu ist er aber auch dafür zuständig, das die GUI gemalt wird.
Bei dir hast du den EDT mit Thread.sleep schlafengelegt, in dieser Zeit konnte der EDT logischerweise nichts mehr machen machen. Deswegen konnte der EDT auch nicht die GUI neu zeichnen, weswegen diese eingefroren ist.

In der neuen Version wird der das Thread.sleep und die anderen Sachen die die GUI verändern innerhalb eines extra Threads gemacht. Wenn du diesen Thread schlafenlegst, kann der EDT trotzdem weiterarbeiten. (Klar, die beiden Threads sind ja unnabhängig voneinander)

Wenn du darüber mehr wissen willst, les dir was über _Multithreading _durch


----------



## iTobi (22. Aug 2009)

supi, danke, das machtsinn und ich verstehs


----------

