【问题标题】:JavaFx - Code before Thread.sleep(1000) doesn't work, why? [closed]JavaFx - Thread.sleep(1000) 之前的代码不起作用,为什么? [关闭]
【发布时间】:2018-02-09 09:06:23
【问题描述】:
下面的 sn-p 可能有什么问题?
@FXML
private Button btnLogOut;
@FXML
private Label lblStatus;
@FXML
private void btnLogOut_Click() throws InterruptedException {
lblStatus.setText("Logging out.."); // Doesn't work..?
Thread.sleep(1000);
System.exit(0);
}
提前感谢您的帮助。
【问题讨论】:
标签:
java
javafx
delay
fxml
【解决方案1】:
通过在应用程序线程上使用Thread.sleep,您可以防止 UI 更新。为了防止这种情况,您需要在不同的线程上运行等待/关闭代码并允许应用程序线程继续执行它的工作:
@FXML
private void btnLogOut_Click() {
// update ui
lblStatus.setText("Logging out..");
// delay & exit on other thread
new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
System.exit(0);
}).start();
}
您可能需要考虑使用Platform.exit() 而不是System.exit。
【解决方案2】:
您似乎在 UI 线程上,因此文本没有更新,因为您与其余代码在同一个线程上。
你应该使用Platform.runLater:
FutureTask<Void> updateUITask = new FutureTask(() -> {
lblStatus.setText("Logging out..");
}
Platform.runLater(updateUITask );
【解决方案3】:
这对我有用:
@FXML
private Button btnLogOut;
@FXML
private Label lblStatus;
@FXML
private void btnLogOut_Click() throws InterruptedException {
lblStatus.setText("Logging out..");
Thread.sleep(100);
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(FXMLMainController.class.getName()).log(Level.SEVERE, null, ex);
}
System.exit(0);
}
});
}