JavaFX延迟for循环中的颜色变化

时间:2018-03-02 10:08:15

标签: java javafx

我有一个填充矩形(4x4)的网格窗格,每个矩形需要更改颜色,需要按特定顺序完成,并且它们之间有延迟。顺序由模型中的模型给出。

演示者在for循环中使用数组,然后告诉视图按索引更改块的颜色。

我尝试了很多事情来增加延迟,这样他们就不会立即激活所有东西,但我似乎无法弄明白。

我的循环:

 int[][] grid = model.getGrid();

 for (int i = 0; i < grid.length; i++) {
     for (int j = 0; j < grid[i].length; j++) {
            view.enableRegularBlock(i, j);
     }

 }

我尝试过的事情: TimeLine:

 public void enableRegularBlock(int i, int j) {
    Timeline timeline = new Timeline(new KeyFrame(
            Duration.millis(500),
            ae -> {
                Rectangle r = blockArray[i][j];
                r.setFill(activeColor);
                startTimer += 500;
            }));
    timeline.play();
 }

这是在for循环中运行,不能同时激活所有矩形。

 int[][] grid = model.getGrid();

    for (int i = 0; i < grid.length; i++) {
        for (int j = 0; j < grid[i].length; j++) {
            final int row = i;
            final int col = j;
            Thread t = new Thread(){
               public void run() {
                   try{

                        Platform.runLater(new Runnable() {
                           @Override
                           public void run() {
                               view.enableRegularBlock(row, col);
                           }
                       });
                       Thread.sleep(500);
                   } catch(InterruptedException v){System.out.println(v);}
               }
           };

           t.start();

        }

    }

这也会立即激活所有矩形。

有没有办法在ui中可见的矩形激活之间添加延迟?所以像这样:view.enableRegularBlock(0,0) - &gt;延迟500ms - &gt; view.enableRegularBlock(0,1) - &gt;延迟500ms ......

谢谢!

1 个答案:

答案 0 :(得分:0)

您不能在线程/事件处理程序之外添加循环,例如

从循环开始的多个时间轴与多个线程一样 并行

激活运行多个周期的Timeline中的所有元素:

Timeline timeline = new Timeline(new KeyFrame(Duration.millis(500), new EventHandler<ActionEvent>() {

    private int i = 0;
    private int j = 0;

    @Override
    public void handle(ActionEvent event) {
        Rectangle r = blockArray[i][j];
        r.setFill(activeColor);
        j++;
        if (j >= blockArray[i].length) {
            // "reset" inner loop, next step in outer loop
            j = 0;
            i++;
        }
    }
}));

// assuming same size of inner arrays here
timeline.setCycleCount(blockArray.length * blockArray[0].length);

timeline.play();

或使用Thread

new Thread(() -> {
    for (int i = 0; i < grid.length; i++) {
        for (int j = 0; j < grid[i].length; j++) {
            final Rectangle r = blockArray[i][j];

            Platform.runLater(() -> r.setFill(activeColor));
            try {
                Thread.sleep(500);
            } catch(InterruptedException v){System.out.println(v);}
        }
    }
}).start();