gpt4 book ai didi

JavaFX 应用程序窗口在尝试显示后台进程状态时卡住

转载 作者:行者123 更新时间:2023-11-30 08:33:20 26 4
gpt4 key购买 nike

我正在开发一个应用程序功能,以在 TextArea 中显示进度状态。我正在使用观察者模式来实现它。但是,当我尝试将状态信息附加到 TextArea 时,窗口会卡住。如何解决这个问题?

像这样的卡住窗口:

Window freezes

doSomething() 完成时。卡住窗口恢复正常。像这样:

Window back to normal

这是我的代码

start(Stage stage)


FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/progressStatus.fxml"));
Parent root = loader.load();
statusStage = new Stage();
statusScene = new Scene(root);
statusStage.setScene(statusScene);
progressStatusController = loader.getController();
statusStage.show();
MyFiles myFiles = new MyFiles();
myFiles.addObserver(progressStatusController);
newMyFiles.doSomething();
public class ProgressStatusController implements Initializable, Observer {
@FXML private ProgressBar progressBar;
@FXML private TextArea textArea;
private String[] message;
@Override
public void initialize(URL location, ResourceBundle resources) {

}
@Override
public void update(Observable o, Object arg) {
System.out.println(arg);
textArea.textProperty().set(textArea.getText().concat("\n").concat((String)arg));
textArea.positionCaret(textArea.getText().length());
}
}

最佳答案

doSomething 是一项长时间运行的任务,因此不应在 JavaFX 应用程序线程上运行。但是 start 方法在此线程上运行。

您需要在不同的线程上运行doSomething 以避免阻塞应用程序线程。 UI 的更新应该在应用程序线程上完成;因此你应该使用 Platform.runLater 来执行更新:

...
MyFiles myFiles = new MyFiles();
myFiles.addObserver(progressStatusController);
new Thread(newMyFiles::doSomething).start();
@Override
public void update(Observable o, Object arg) {
System.out.println(arg);
Platform.runLater(() -> {
textArea.setText(textArea.getText() + "\n" + arg);
textArea.positionCaret(textArea.getText().length());
});
}

关于JavaFX 应用程序窗口在尝试显示后台进程状态时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39532257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com