新窗口中的 JavaFX 进度指示器不会 "spin"

标签 java javafx window progress indicator

我制作了登录屏幕,现在我必须做一些后台工作,大约需要 8-10 秒,我制作了带有进度指示器的新窗口(不确定),但它只是弹出并且是静态的(不旋转),我想我'我在线程部分做错了,这里是代码:

Task<Boolean> loginTask = new Task<Boolean>() {
        @Override
        protected Boolean call() throws Exception {
            return true;
        }
    };

    loginTask.setOnRunning(e -> {

           //background task(collecting data)

    });

之后我做了这个:

 Thread thread = new Thread(loginTask);
    thread.setDaemon(true);
    thread.start();

    //progress indicator window
    Parent p = null;
    try {
        p = FXMLLoader.load(getClass().getResource("/fxml/loginLoader.fxml"));
        p.setVisible(true);
        Scene scene = new Scene(p);
        Stage wndw = new Stage();
        this.loadingStage=wndw;
        wndw.setTitle("Loading data... Please wait.");
        wndw.setScene(scene);
        wndw.show();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

它会弹出,但它是静态的:

enter image description here

我需要做什么才能使进度指示器旋转?

最佳答案

您垄断了JavaFX应用程序线程,这意味着它无法更新UI,因此ProgressIndicator不会产生动画。

Task<Boolean> loginTask = new Task<Boolean>() {
    @Override
    protected Boolean call() throws Exception {
        return true;
    }
};

loginTask.setOnRunning(e -> {
    //background task(collecting data)
});

您的评论表明您正在 onRunning 处理程序中执行实际工作,这不是使用 Task 的正确方法。当 Task 进入 RUNNING 状态时,该处理程序在 FX 线程上被调用;它意味着您可以在其中更新 UI 以指示状态更改等回调。任务的实际工作应该在后台线程上调用的 call() 方法中完成。

关于新窗口中的 JavaFX 进度指示器不会 "spin",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557361/

相关文章:

java - 在 JLink 构建上从外部 url 加载图像时握手失败

java - 在 Java 中向列表中添加值是否会复制数据或创建引用?

java - 如何使用 JavaScript 访问保存在请求范围内的数组或列表?

java - 如何防止在javafx tabpane中添加下拉菜单

java - 有没有一种方法可以更改 Java 属性而不向其监听器触发值更改事件?

wpf - 获取 WPF 窗口的 XAML 源

linux下QT窗口ActivationChange事件

javascript - 像window.load这样的东西可以在ajax调用后使用吗?

java - 使用 Liferay 下载大文件 (GB) 时如何修复错误 `Java heap space`

java - 如何停止从 Eclipse 启动器启动的 Play 服务器