如何返回任务并用于更新javafx中的进度条

时间:2015-08-15 06:29:08

标签: java javafx

我正在尝试更新添加到ProgressBar中单独舞台的javafx。我在名为messagemerge()的方法中定义了任务,并从那里调用包含此任务的新线程。每次我尝试使用方法messagemerge()返回到main的任务时,它会抛出NullPointerException

这就是我试过的

ProgressBarDialog progressBarDialog=new ProgressBarDialog();
Task<Void> task=messageMerge();
progressBarDialog.progressBar.progressProperty().bind(task.progressProperty());

上面的代码写在主

方法messageMerge()如下定义

public Task<Void> messageMerge() throws Exception
{
  task=new Task<Void>(){
  protected Void call()throws Exception{
    for(i=0;i<50;i++)
    updateProgress(i,50);
    }
    return null;
    };
  Thread thread=new Thread(task);
  thread.start();
  return task;
}

progessBarDialog是另一个定义如下的类

public class ProgressBarDialog {
public ProgressBar progressBar=null;
public ProgressBarDialog()
{
    Stage progressDialog=new Stage();
    progressDialog.initModality(Modality.APPLICATION_MODAL);
    ProgressBar progressBar=new ProgressBar();
    progressBar.setProgress(0);

    BorderPane progressPane=new BorderPane();
    progressPane.setCenter(progressBar);
    progressDialog.setScene(new Scene(progressPane,500,100));
    progressDialog.show();

}
当我尝试从主要版本访问NullPointerException时,会出现

task.progressProperty()。有人可以帮我这个。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

什么是错误的

这只是一个逻辑错误,您没有初始化progressBar成员变量,它始终为null。当您尝试使用progressBar成员时,会出现NullPointerException。

基本上,您通过在不同的范围内重新声明它是{BAR}变量"shadowing",因此永远不会为原始变量赋值。

如何修复

要解决此问题,请替换以下行:

ProgressBar progressBar=new ProgressBar()

使用:

progressBar=new ProgressBar() 

不相关,但样本中的可疑代码

顺便说一句,messageMerge函数中的任务用法看起来也很可疑,您可能应该在本地向您的方法声明任务(尽管这不太可能是您的NullPointerException的来源)。 massageMerge返回一个任务,所以你通常不需要在函数中将类成员变量设置为相同的值(因为你的调用代码只能使用massageMerge函数返回的值)。

而不是:

task=new Task<Void>() { ...

你可能想要:

Task<Void> task=new Task<>() { ...

替代实施

您不需要自己编写ProgressDialog代码,可以使用Makery progress dialog example based on only the JavaFX APIs,也可以使用第三方ControlsFX ProgressDialog

注意为模态正确设置窗口所有权

无论哪种方式,您可能都想关注Window Modality