[英]Java FX - Progress bar update
当jar应用程序启动时,我有一种方法需要一段时间才能完成。 为了获得一些反馈,我创建了frmWaiting
表单,其中显示了一个简单的不确定进度栏。 我也有一个窗体Controller, PrincipalController
。
应用程序的入口点
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
Stage stagePrincipal = new Stage();
Parent parentPrincipal = FXMLLoader.load(getClass().getClassLoader().getResource("frmPrincipal.fxml"));
Scene scenePrincipal = new Scene(parentPrincipal, 300, 275);
stagePrincipal.setScene(scenePrincipal);
stagePrincipal.setHeight(400);
stagePrincipal.setWidth(500);
stagePrincipal.setResizable(false);
stagePrincipal.setTitle("Instalador");
stagePrincipal.show();
} catch (Exception e) {
e.printStackTrace();
}
}
PrincipalController-frmPrincipal.fxml:
@Override
public void initialize(URL location, ResourceBundle resources) {
try {
Stage stageWaiting = new Stage();
Parent parentWaiting;
parentWaiting = FXMLLoader.load(getClass().getClassLoader().getResource("frmWaiting.fxml"));
Scene sceneWaiting = new Scene(parentWaiting, 300, 275);
stageWaiting.setScene(sceneWaiting);
stageWaiting.setHeight(300);
stageWaiting.setWidth(400);
stageWaiting.setResizable(false);
stageWaiting.setTitle("Instalador");
stageWaiting.show();
} catch (IOException e) {
}
}
WaitingController-frmWaiting.xml:
public class WaitingController implements Initializable {
@FXML private ImageView img;
@FXML private ProgressBar progressBar;
@FXML private ProgressIndicator pgIndicator;
private Task copyTask;
@Override
public void initialize(URL location, ResourceBundle resources) {
img.setImage(new Image(getClass().getClassLoader().getResourceAsStream("image.png")));
progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS);
ArquivoController.getInstance().copiaArquivosPadrao(); //This is the method that takes a while.
}
public ProgressBar getProgressBar() {
return progressBar;
}
我想初始化我的主要形式frmPrincipal
,这需要花一会儿时间。 我也想让进度条正常工作。 我试图在另一个线程上执行此操作,但是方法完成后无法从中获取响应。
所有.fxml文件都是正确的,如果可能的话,将其省略以使事情变得更容易。
这样,应用程序等待方法完成,然后打开其他表单。 但是,progressBar不会更新。
内部ArquivoController.getInstance().copiaArquivosPadrao();
您必须更新progressBar
的进度。
您可以通过使用Task
来运行copiaArquivosPadrao()
,并相应地更新任务进度并将其绑定到task progress属性,这是一种很好的方法。
或者,您可以通过将progressBar
传递给copiaArquivosPadrao()
来copiaArquivosPadrao()
以下操作:
public void initialize(URL location, ResourceBundle resources) {
img.setImage(new Image(getClass().getClassLoader().getResourceAsStream("image.png")));
progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS);
ArquivoController.getInstance().copiaArquivosPadrao(progressBar); //This is the method that takes a while.
}
和
public void copiaArquivosPadrao(ProgressBar progressBar) {
// call progressBar.setProgress() in here to update the progress bar
// eg.
progressBar.setProgress(0.0F);
doSomething();
progressBar.setProgress(0.20F);
doSomething();
progressBar.setProgress(0.40F);
doSomething();
progressBar.setProgress(0.60F);
doSomething();
progressBar.setProgress(0.80F);
doSomething();
progressBar.setProgress(1.00F);
}
当然,您可以通过循环或类似方式更细粒度地执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.