gpt4 book ai didi

java - 如何保持javafx中的进度指示器运行

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:47 25 4
gpt4 key购买 nike

我希望进度指示器仅在完全更新用户界面后停止。但它在执行 ui 方法中的最后一行代码后停止。该指标应如下工作:

1> Start the progress
2> Run the progress until all nodes are added to the scene
3> Stop after completion

我更新的方式是,我将 BorderPane 传递给线程并将其中心设置为 gridpane,这是指示器停止后的最后一行代码。还有登录任务,如果我在应用程序线程内启动它,指示器不会旋转!

borderpane.setCenter(gpane);

界面方法

{
Loading loadBar = new Loading(stage);
Task<Boolean> loginTask= checkCredTask();
loginTask.setOnSucceeded(value -> {
loadBar.hideProgress(); });

loadBar.startTask(loginTask);
(new Thread(loginTask)).start();

}

进度条

public class Loading{

private static Stage stage;
private static ProgressIndicator p;
private static Alert alert;

public Loading(Stage s){
stage=s;
p=new ProgressIndicator();
alert = new Alert(AlertType.NONE);

}


public void startTask(Task<Boolean> cm){
if(p != null){
p.setProgress(-1);
p.progressProperty().unbind();
p.progressProperty().bind(cm.progressProperty());
alert.initOwner(stage);
alert.getDialogPane().setStyle("-fx-background-color:rgba(0,0,0,0);");
alert.getDialogPane().getScene().setFill(Color.TRANSPARENT);
alert.initStyle(StageStyle.TRANSPARENT);
alert.getDialogPane().setContent(p);
alert.show();
}
}


public void hideProgress(){
alert.setResult(ButtonType.CLOSE);
}
}

任务

private Task<Boolean> checkCredTask() {
Task<Boolean> loginTask = new Task<Boolean>() {
@Override
public Boolean call() {
Boolean result = false;
int flag = verifyCredential();
if (flag == 1) {
loadUI();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result = true;
} else if (flag == 2) {
result = false;
}
return result;
}
};
return loginTask;
}

加载UI方法

ExecutorService execsrv = Executors.newSingleThreadExecutor();
execsrv.execute(new AdminUI(stage,pane,mb));
execsrv.shutdown();

最佳答案

你的代码甚至无法编译。 Task<Boolean> loginTask不覆盖抽象 call()方法。即使你包裹起来

ExecutorService execsrv = Executors.newSingleThreadExecutor();
execsrv.execute(new AdminUI(stage,pane,mb));
execsrv.shutdown();

call()方法没有意义,因为您正在另一个任务中执行新任务。

假设 new AdminUI(stage,pane,mb)是长时间运行的进程并返回 boolean你应该这样做:

Task<Boolean> loginTask = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
// Start the UI
AdminUI ui = new AdminUI(stage, pane, mb);
return ui.getBooleanValue();
}
};

编辑

正如我所说,你正在执行AdminUI里面的任务loginTask这没有任何意义。现在您只等待登录任务,而不等待 AdminUI任务。登录任务完成的速度比 AdminUI 更快,这就是指示器提前停止的原因。摘录AdminUI到另一个Task 。这是伪代码,因此您必须自己完成。

Task<Boolean> loginTask= checkCredTask();
loginTask.setOnSucceeded(value -> {
//****** THIS IS PSEUDO CODE ***********
//start AdminUITask
//AdminUITask.setOnSucceeded(value -> {
//loadBar.hideProgress();
//});
});

关于java - 如何保持javafx中的进度指示器运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42360459/

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