簡體   English   中英

JavaFX延遲for循環中的顏色更改

[英]JavaFX delay change of color in for loop

我有一個用矩形(4x4)填充的網格窗格,每個矩形都需要更改顏色,並且需要以特定的順序完成,並在它們之間延遲。 該順序由模型在數組中給出。

演示者在for循環中使用數組,然后告訴視圖按索引更改塊的顏色。

我嘗試了很多事情來增加延遲,以使它們不會一次激活所有功能,但是我似乎無法弄清楚。

我的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);
     }

 }

我嘗試過的事情: 時間軸:

 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)-> delay 500ms-> view.enableRegularBlock(0,1)-> delay 500ms ...

謝謝!

您不得將循環添加到線程/事件處理程序之外。

從循環開始的多個時間軸多個線程並行運行。

從運行多個周期的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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM