JavaFX进度指示器在新窗口中不会“旋转”

问题描述 投票:0回答:1

我做了登录屏幕,现在我必须做一些后台工作,大约需要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

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

java javafx window progress indicator
1个回答
1
投票
您正在垄断

JavaFX Application Thread,这意味着它无法更新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()方法中完成。
© www.soinside.com 2019 - 2024. All rights reserved.