Sobald du einmal den Button drückst, bist du in einer Endlosschleife. Damit wird dein Fenster nicht neu gezeichnet. Verwende für solche Dinge einen Timer.
Zudem: Thread.sleep legt zusätzlich dein Programm lahm. Auch hier: das Fenster kann nicht neu gezeichnet werden. (Falls Thread.sleep im GUI_Thread ausgeführt wird.)
Ich hätte sowas in der Richtung gemacht:
[code=Java]import java.util.Timer;
import java.util.TimerTask;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class Grafik extends Application {
private int state = 0;
private Circle[] circles = new Circle[3];
private Timer timer = new Timer();
private TimerTask tt = null;
public static boolean states[][] = { { true, false, false }, { true, true, false }, { false, false, true },
{ false, true, false } };
public static Color colors[] = { Color.RED, Color.YELLOW, Color.GREEN };
public static void main(String[] args) {
launch(args);
}
public void nextState() {
state++;
boolean[] currentState = states[state % 4];
for (int i = 0; i < 3; i++) {
if (currentState[i]) {
circles[i].setFill(colors[i]);
} else {
circles[i].setFill(Color.GRAY);
}
}
}
public void startTimer() {
if(tt != null){
tt.cancel();
}
tt = new TimerTask() {
@Override
public void run() {
nextState();
}
};
timer.schedule(tt, 0, 2000);
}
@Override
public void start(Stage pStage) throws Exception {
StackPane sp = new StackPane();
VBox vb = new VBox();
vb.setAlignment(Pos.CENTER);
for(int i = 0 ; i < 3 ; i++){
circles[i] = new Circle();
circles[i].setRadius(100);
circles[i].setFill(Color.GREY);
vb.getChildren().add(circles[i]);
}
VBox vbt = new VBox();
Button startbtn = new Button("Start");
Button stoppbtn = new Button("Stopp");
startbtn.setOnAction(e -> startTimer());
stoppbtn.setOnAction(e -> tt.cancel());
vbt.getChildren().addAll(startbtn, stoppbtn);
vbt.setAlignment(Pos.BASELINE_LEFT);
vbt.setSpacing(15);
vbt.setPadding(new Insets(10, 10, 10, 10));
sp.getChildren().addAll(vb, vbt);
Scene scene = new Scene(sp, 600, 600);
pStage.setTitle("Ampelsteuerung");
pStage.setScene(scene);
pStage.show();
}
}[/code]