Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
857 views
in Technique[技术] by (71.8m points)

java - JavaFX UI Frozen when performing Task in new Thread

I have a problem getting the JavaFX UI to keep active while performing a background Task. I have set up this very simple code -

@FXML
ProgressBar prgbProgress;

@FXML
private void onClick(ActionEvent event) {
      Task <Void> t = new Task <Void> () {

        @Override
        protected Void call() throws Exception {
          for (int i = 0; i < 10; i++) {
            updateProgress(i, 9);
            Thread.sleep(1000);
          }
          return null;
        }
      };
      prgbProgress.progressProperty().bind(t.progressProperty());
      new Thread(t).run();
}

What I expect to happen is to have the progress bar update every ~1 second until the task is complete. Instead, the UI completely freezes for 10 seconds, after which the progress bar appears completed. Just to make it clear - the problem isn't only that all of the updates appear at once in the end, but also that the UI is completely unresponsive until then.

I have read just about any other question about this topic, but can't find an answer. What am I doing wrong?

Thanks.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Use start() instead of run()

@FXML
ProgressBar prgbProgress;

@FXML
private void onClick(ActionEvent event) {
      Task <Void> t = new Task <Void> () {

        @Override
        protected Void call() throws Exception {
          for (int i = 0; i < 10; i++) {
            updateProgress(i, 9);
            Thread.sleep(1000);
          }
          return null;
        }
      };
      prgbProgress.progressProperty().bind(t.progressProperty());
      //new Thread(t).run(); // wrong
      new Thread(t).start(); // right
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...