Auf Thema antworten

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]



Oben