JavaFx - Thread.sleep(1000)之前的代码不起作用,为什么?

时间:2018-02-09 09:06:24

标签: java javafx delay fxml

下面的代码段会出现什么问题?

setvbuf(stdout, LINFLEX_0.BDRL.B.DATA0, _IOFBF, 1);

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

好像你在UI线程上,因此文本没有更新,因为你和你的其他代码在同一个线程上。

您应该使用Platform.runLater

FutureTask<Void> updateUITask = new FutureTask(() -> {
    lblStatus.setText("Logging out..");
}

Platform.runLater(updateUITask );

答案 1 :(得分:2)

在应用程序线程上使用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 :(得分:0)

以下是对我有用的:

@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);
        }
    });
}