Java,如何在 JavaFX 中暂停

Java, how to make a pause in JavaFX

我有 4 个按钮,我想让它们闪烁。为此,我需要暂停一下。我怎样才能在每次迭代后简单地暂停 500 毫秒? 可以不用线程吗?

public void blink() {
        Button[] btn = new Button[]{btn1, btn2, btn3, btn4};
        Random rn = new Random();

        for (int i = 0; i < 100; i++) {
            int d = rn.nextInt(4) + 1;
            new Timeline(
                    new KeyFrame(Duration.seconds(0), new KeyValue(btn[d - 1].opacityProperty(), .1)),
                    new KeyFrame(Duration.seconds(0.5), new KeyValue(btn[d - 1].opacityProperty(), 1))
            ).play();
            //PAUSE HERE//
        }
    }

可以不用线程,使用经典的 Thread.sleep(500) 调用。

但是您的整个 UI 线程将休眠,这意味着您 UI 上的其他控件在这 500 毫秒内将无法工作。


编辑

如下所述,问题是 Timeline.play() 是异步的。如果您不想使用额外的线程,请创建一个同步代码。

public void blink() {
    Button[] btn = new Button[]{btn1, btn2, btn3, btn4};
    Random rn = new Random();

    for (int i = 0; i < 100; i++) {
        int d = rn.nextInt(4) + 1;

        btn[d - 1].setOpacity(.1);
        Thread.sleep(500);
        btn[d - 1].setOpacity(1);
        Thread.sleep(500);
    }
}

编辑 2

另一种解决方案,与 Timeline 异步,但我们只创建一个,大 Timeline

public void blink() {
    Button[] btn = new Button[]{btn1, btn2, btn3, btn4};
    Random rn = new Random();
    Timeline myTimeline = new Timeline();
    double millis = 0.0;

    for (int i = 0; i < 100; i++) {
        int d = rn.nextInt(4) + 1;

        myTimeline.getKeyFrames().add(new KeyFrame(Duration.seconds(millis), new KeyValue(btn[d - 1].opacityProperty(), .1)));
        millis += 0.5;
        myTimeline.getKeyFrames().add(new KeyFrame(Duration.seconds(millis), new KeyValue(btn[d - 1].opacityProperty(), 1)));
        millis += 0.5;
    }

    myTimeline.play();
}

但那是一大块Timeline

您可以使用时间线的循环和自动反转功能:

Timeline t = new Timeline(
                    new KeyFrame(Duration.seconds(0), new KeyValue(btn[d - 1].opacityProperty(), .1)),
                    new KeyFrame(Duration.seconds(0.5), new KeyValue(btn[d - 1].opacityProperty(), 1))
            );
t.setAutoReverse(true);
t.setCycleCount(Timeline.INDEFINITE); 
t.play();