Java,如何在JavaFX中暂停

Java,如何在JavaFX中暂停,java,button,javafx,sleep,pause,Java,Button,Javafx,Sleep,Pause,我有4个按钮,我想让它们闪烁。我需要暂停一下。我如何在每次迭代后暂停500毫秒?有没有可能不用线程 使用经典的thread.sleep500调用,可以不使用thread 但您的整个UI线程将处于休眠状态,这意味着您的UI上的其他控件在这500毫秒内将无法工作 编辑 正如下面所说的,问题在于Timeline.play是异步的。如果不想使用其他线程,请创建同步代码 public void blink() { Button[] btn = new Button[]{btn1, btn2, bt

我有4个按钮,我想让它们闪烁。我需要暂停一下。我如何在每次迭代后暂停500毫秒?有没有可能不用线程


使用经典的thread.sleep500调用,可以不使用thread

但您的整个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);
    }
}

但这是一个很大的时间线。

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

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();

为什么要避免线程?请检查我的编辑@batmann,问题是当UI线程休眠时,我看不到闪烁。所以我应该为这个任务使用另一个线程?没有时间线,因为这是一个异步操作,在播放后立即返回。我将编辑我的答案,以获得没有时间表的建议。
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 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();