2017-05-06 30 views
0

我有4个按钮,我想让它们闪烁。我需要为此而暂停。我如何在每次迭代之后简单地暂停500ms? 没有线程可以做到吗?Java,如何在JavaFX中暂停

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// 
     } 
    } 
+0

为什么要避免线程? –

+0

检查我的编辑@Batmannn –

回答

1

您可以使用时间轴的能力回路和自动反转:

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

很可能没有线程,采用了经典的Thread.sleep(500)电话。

但是您的整个UI线程都会处于睡眠状态,这意味着您的用户界面上的其他控件在这500毫秒内将不起作用。


EDIT

正如下面所说的问题是,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); 
    } 
} 

EDIT 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

+0

这就是当UI线程睡眠时,我看不到闪烁的问题。所以我应该使用另一个线程来完成这个任务? – Batmannn

+0

使用时间线否,因为它是一个异步操作(在'play()'之后立即返回)。我将在没有时间线的情况下编辑我的答案。 – kagmole