Permanent laufender loop mit Eingabefunktion gesucht

Hallo ihr Lieben, ich mal wieder o_o
Ich habe jetzt eine Weile nicht mehr mit Java gewerkelt aber wollte demnächst mal wieder weiter machen. Das Problem ist, ich möchte gerne an einer Stelle weiter machen, die mir damals Probleme bereitet hatte, und um derentwillen ich jetzt mal wieder Rat ersuche.
Eins vorweg, ich bin nach wie vor blutiger Anfänger.
Ich weiß wie ich bei Netbeans JFrames erstelle, ich weiß, wie ich Textfelder, Buttons, etc. erstelle und auch wie ich deren Inhalt manipulieren kann. Soweit so gut.
Ich interessiere mich für Zahlensimulationen, und versuche immer mal wieder eine zu erstellen, stolpere aber immer über den gleichen Fehler:
Angenommen ich habe ein JFrame mit Hasen, Füchsen, Pflanzen. Alle drei sind von einander abhängig. Mit jedem Tick im Loop soll sich die Zahl aller dreien in Relation zueinander verändern. Pflanzen wachsen, Hasen vermehren sich, Füchse vermehren sich anhand der Hasenmenge, usw. Das Layout und alles bekomme ich gut hin.
Und jetzt das eigentliche Problem: Wenn ich das versuche über einen (mir bekannten) Loop laufen zu lassen, egal welchen, dann stoppt das Programm kurz, ich kann nichts eingeben oder verändern, und zeigt mir dann den finalen wert an. Ich kann also während dem laufenden Loop keine Parameter verändern, und ich kann das "Wachstum" auch nicht beobachten, ich sehe nur den Anfang und das Ende.

An dieser Stelle bitte ich euch um Hilfe, und bevor ihr annehmt, ich sei hier super faul, würden mir auch ein paar Begriffe oder Stichwörter genügen, ich lese mich dann gerne rein. Aber gibt es, bzw. womit muss ich arbeiten um eine Art Loop zu erhalten, der einfach läuft, und in den ich Parameter eingeben kann (plötzlich sterben 50% der Hasen, etc.) und der mir dann prompt beim nächsten Tick die aktuellsten Daten ausgibt.

For, while, do while usw. sind mir ein begriff, aber gibt es etwas, was ich übersehe? Vielleicht eine Lösung, die weit abseits dieses Themas liegt? Ich komme nicht weiter o.0
 
K

kneitzel

Ohne Details von Dir ist es etwas Rätzelraten. Aber bei den UI Frameworks ist es so, dass es einen UI Thread gibt. Dieser macht eigentlich nichts anderes, als ständig zu prüfen, ob Events vorliege, auf die reagiert werden muss. Events können alles mögliche sein:
- Anwender hat etwas gemacht, z.B. ein Mausclick
- Es gibt eine Anforderung von außen z.B. die Anforderung, dass etwas neu gemalt werden soll. (Fenster hat sich aktualisiert, ein verdeckter Bereich ist nicht mehr verdeckt, was auch immer ...)

Und wenn Du nun einen Control änderst (also z.B. einem Label ein neuen Wert zuweist), dann passieren zwei Dinge:
- in dem Objekt wird der Wert angepasst.
- Das Objekt wird zum neu malen markiert und ggf. ein Event in die Eventloop gesetzt, dass ein neu Malen getriggert werden soll.

Diese Events landen dann auch irgendwann bei Dir, z.B. der Eventhandler für einen Mausclick. Dies bedeutet aber, dass dieser Code nun im UI Thread ausgeführt wird. So lange wie Du da also irgend was machst, wird das Fenster nicht aktualisiert (neu gemalt), denn dazu müsste der UIThread ja erst einmal das Event zum neu malen abarbeiten.

Somit gilt die Regel, dass man keinerlei langlaufende Dinge im UI Thread machen sollte.

Hier gibt es nun diverse Möglichkeiten:
a) Man kann langlaufende Dinge in einem separaten Thread durchführen.
b) Wenn es Dir um mehrere, zeitlich hintereinander durchzuführende Tätigkeiten geht, dann ist ein Timer sinnvoll.

Hier kommt aber dann evtl. gleich das nächste Problem: Viele Framework sind nicht thread sicher und mögen es nicht wirklich, wenn sie von außerhalb des UI Threads aktualisiert werden. Daher haben so Frameworks oft Ihre eigenen Timer, die dann im UIThread laufen (Gut für schnelle Dinge, wie z.B. bei Dir um alle x Sekunden eben schnell eine neue Anzahl an Pflanzen, Hasen und Füchsen zu berechnen.) sowie eine Hilfreiche Implementierung für lang laufende Prozesse, die zwischendurch etwas updaten wollen.

Bei Swing sind hier konkret zu nennen:
https://docs.oracle.com/javase/7/docs/api/javax/swing/package-summary.html#threading Abschnitt über Swings Threading Policy
https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html SwingWorker für langlaufende Sachen.
https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable) SwingUtilities.invokeLater um kurze Aktionen auf dem UIThread lauden zu lassen (z.B. die Aktualisierung von Labels, so man auf einem anderen Thread ist als dem UIThread)
https://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html der Timer von Swing
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben