Создание задержки между этапами в JavaFX - PullRequest
0 голосов
/ 27 марта 2019

Я показываю сетку пользователю и обновляю ее пару раз в цикле for. Что мне нужно сделать, так это то, что перед каждым обновлением мне нужно создать секунду задержки, чтобы позволить пользователю увидеть сцену на секунду.

VisualizationThread visualizationThread = new VisualizationThread(matrix, bestIndividual, centerX, centerY);
for(int i=0; i<bestIndividual.size(); i++){
  switch (bestIndividual.get(i)){
    case 1:
        visualizationThread.setCurrentX(visualizationThread.getCurrentX()-1);
        break;
    case 2:
        visualizationThread.setCurrentY(visualizationThread.getCurrentY()+1);
        break;
    case 3:
        visualizationThread.setCurrentX(visualizationThread.getCurrentX()+1);
        break;
    case 4:
        visualizationThread.setCurrentY(visualizationThread.getCurrentY()-1);
        break;
  }

  visualizationThread.run();
  try {
      Thread.sleep(1000);
  }catch (Exception e){
      e.printStackTrace();
  }

}

Класс VisualizationThread:

public class VisualizationThread implements Runnable{

    private ArrayList<ArrayList<Integer>> matrix;
    private ArrayList<Integer> solution;
    private int currentX;
    private int currentY;
    private Stage primaryStage;

    public VisualizationThread(ArrayList<ArrayList<Integer>> matrix, ArrayList<Integer> solution, int currentX, int currentY){
        this.matrix   = matrix;
        this.solution = solution;
        this.currentX = currentX;
        this.currentY = currentY;
        this.primaryStage = new Stage();
    }

    public void run() {

        if(primaryStage.isShowing()){
            primaryStage.close();
        }

        BorderPane root = new BorderPane();

        GridPane grid = new GridPane();
        grid.setPadding(new Insets(10));
        grid.setHgap(10);
        grid.setVgap(10);

        StackPane[][] screen_buttons = new StackPane[matrix.size()][matrix.size()];

        for (int y=0;y<matrix.size();y++) {
            for (int x=0;x<matrix.get(y).size();x++) {
                screen_buttons[y][x] = new StackPane();
                Rectangle rec = new Rectangle(30,30);
                if(x == currentX && y == currentY){
                    rec.setFill(Color.GREEN);
                }else {
                    rec.setFill(matrix.get(x).get(y) == 0 ? Color.YELLOW : Color.RED);
                }
                rec.setStyle("-fx-arc-height: 10; -fx-arc-width: 10;");
                screen_buttons[y][x].getChildren().addAll(rec);
                grid.add(screen_buttons[y][x], x, y);
            }
        }

        //container for controls
        GridPane controls = new GridPane();

        root.setCenter(grid);
        root.setBottom(controls);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public int getCurrentX() {
        return currentX;
    }

    public void setCurrentX(int currentX) {
        this.currentX = currentX;
    }

    public int getCurrentY() {
        return currentY;
    }

    public void setCurrentY(int currentY) {
        this.currentY = currentY;
    }
}

Моя проблема в том, что сцена выглядит пустой, пока не будут выполнены все итерации. Но я хочу показать каждую итерацию на некоторое время, и я попытался реализовать это с помощью Thread.sleep (). Очевидно, это не сработало. Это почему? Как мне этого добиться? С наилучшими пожеланиями,

...