Nabend zusammen,
ich bin gerade dabei ein rundenbasiertes Spiel zu erstellen, bei denen eine Person gegen 3 Spieler (KI´s) antritt.
Jeder Zug eines Spielers wird in einer Console (wird als TextArea dargestellt) protokolliert.
Um eine Nachdenkzeit bei den KI´s zu simmulieren, möchte ich nach/vor jedem Zug ein Wartezeit einbauen.
Das pausieren funktioniert prinzipiell auch, nur dass das Schreiben in die Console nicht nach jedem Zug (Schleifendurchlauf) geschieht, sondern erst "alles" am Ende der Laufzeit geschrieben wird.
Mittlerweile weiß ich, dass nach setText()/appendText() der Text nicht direkt geschrieben/angezeit wird, sondern erst, wie ich ja auch schon sage, am Ende der Laufzeit. Ich habe mir dazu mal ein vereinfachtes Beispiel einfallen lassen um das Problem evtl. etwas nachvollziehbarer aufzuzeigen
Hier wird nach dem Buttonklick der Text nicht nach 3 Sekunden geschrieben, sondern erst am Ende. Wenn ich das Problem in dem Beispiel gelöst bekomme, müsste ich dies auch für mein Projekt abbildbar sein. Ich schätze, dass ich nach dem Schreiben des Textes irgendwie dafür sorgen muss, dass die UI-Komponente neu gerendet wird, oder liege ich da falsch?
ich bin gerade dabei ein rundenbasiertes Spiel zu erstellen, bei denen eine Person gegen 3 Spieler (KI´s) antritt.
Jeder Zug eines Spielers wird in einer Console (wird als TextArea dargestellt) protokolliert.
Um eine Nachdenkzeit bei den KI´s zu simmulieren, möchte ich nach/vor jedem Zug ein Wartezeit einbauen.
Das pausieren funktioniert prinzipiell auch, nur dass das Schreiben in die Console nicht nach jedem Zug (Schleifendurchlauf) geschieht, sondern erst "alles" am Ende der Laufzeit geschrieben wird.
Mittlerweile weiß ich, dass nach setText()/appendText() der Text nicht direkt geschrieben/angezeit wird, sondern erst, wie ich ja auch schon sage, am Ende der Laufzeit. Ich habe mir dazu mal ein vereinfachtes Beispiel einfallen lassen um das Problem evtl. etwas nachvollziehbarer aufzuzeigen
Java:
package com.example;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TestClass extends Application {
private int loopCounter = 0;
@Override
public void start(Stage primaryStage) {
Button button = new Button("Text generieren");
TextArea textArea = new TextArea();
button.setOnAction(event -> {
do {
String newText = "Hier ist der neue generierte Text.\n";
textArea.appendText(newText);
//updateUi() ???
pauseExecution(3000);
} while (someCondition());
});
// Layout
VBox root = new VBox();
root.getChildren().addAll(button, textArea);
// Szenen-Erstellung und Zuweisung zum Primarstage
Scene scene = new Scene(root, 300, 200);
primaryStage.setScene(scene);
primaryStage.setTitle("JavaFX TextArea Beispiel");
primaryStage.show();
}
private void pauseExecution(int milliseconds) {
try {
Thread.sleep(milliseconds);
} catch (InterruptedException ignored) {
}
}
private boolean someCondition() {
loopCounter++;
return loopCounter < 5;
}
public static void main(String[] args) {
launch(args);
}
}
Hier wird nach dem Buttonklick der Text nicht nach 3 Sekunden geschrieben, sondern erst am Ende. Wenn ich das Problem in dem Beispiel gelöst bekomme, müsste ich dies auch für mein Projekt abbildbar sein. Ich schätze, dass ich nach dem Schreiben des Textes irgendwie dafür sorgen muss, dass die UI-Komponente neu gerendet wird, oder liege ich da falsch?