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