如何在javafx中返回任务并用于更新progressbar

如何在javafx中返回任务并用于更新progressbar,java,javafx,Java,Javafx,我正在尝试更新一个ProgressBar,它被添加到javafx中的一个单独阶段。我在一个名为messagemerge()的方法中定义了任务,并从那里调用了一个包含此任务的新线程。每次我尝试使用方法messagemerge()返回给main的任务时,它都会抛出一个NullPointerException 这就是我尝试过的 ProgressBarDialog progressBarDialog=new ProgressBarDialog(); Task<Void> task=messa

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

这就是我尝试过的

ProgressBarDialog progressBarDialog=new ProgressBarDialog();
Task<Void> task=messageMerge();
progressBarDialog.progressBar.progressProperty().bind(task.progressProperty());
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()
时发生。有人能帮我一下吗。感谢您的帮助。

怎么了

这只是一个逻辑错误,您没有初始化progressBar成员变量,它总是空的。当您尝试使用progressBar成员时,会得到一个NullPointerException

本质上,您是progressBar变量,在不同的范围内重新定义它,因此您的原始变量永远不会被赋值

如何修复

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

ProgressBar progressBar=new ProgressBar()
与:

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

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

而不是:

task=new Task<Void>() { ...
task=newtask(){。。。
您可能想要:

Task<Void> task=new Task<>() { ...
Task Task=new Task(){。。。
替代实现

您不需要自己编写ProgressDialog,您可以使用,也可以使用第三方

注意正确设置通道的窗口所有权

无论哪种方式,您都可能需要注意。

出了什么问题

这只是一个逻辑错误,您没有初始化progressBar成员变量,并且该变量始终为空。当您尝试使用progressBar成员时,会得到一个NullPointerException

本质上,您是progressBar变量,在不同的范围内重新定义它,因此您的原始变量永远不会被赋值

如何修复

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

ProgressBar progressBar=new ProgressBar()
与:

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

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

而不是:

task=new Task<Void>() { ...
task=newtask(){。。。
您可能想要:

Task<Void> task=new Task<>() { ...
Task Task=new Task(){。。。
替代实现

您不需要自己编写ProgressDialog,您可以使用,也可以使用第三方

注意正确设置通道的窗口所有权

无论哪种方式,您都可能需要注意。

出了什么问题

这只是一个逻辑错误,您没有初始化progressBar成员变量,并且该变量始终为空。当您尝试使用progressBar成员时,会得到一个NullPointerException

本质上,您是progressBar变量,在不同的范围内重新定义它,因此您的原始变量永远不会被赋值

如何修复

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

ProgressBar progressBar=new ProgressBar()
与:

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

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

而不是:

task=new Task<Void>() { ...
task=newtask(){。。。
您可能想要:

Task<Void> task=new Task<>() { ...
Task Task=new Task(){。。。
替代实现

您不需要自己编写ProgressDialog,您可以使用,也可以使用第三方

注意正确设置通道的窗口所有权

无论哪种方式,您都可能需要注意。

出了什么问题

这只是一个逻辑错误,您没有初始化progressBar成员变量,并且该变量始终为空。当您尝试使用progressBar成员时,会得到一个NullPointerException

本质上,您是progressBar变量,在不同的范围内重新定义它,因此您的原始变量永远不会被赋值

如何修复

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

ProgressBar progressBar=new ProgressBar()
与:

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

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

而不是:

task=new Task<Void>() { ...
task=newtask(){。。。
您可能想要:

Task<Void> task=new Task<>() { ...
Task Task=new Task(){。。。
替代实现

您不需要自己编写ProgressDialog,您可以使用,也可以使用第三方

注意安全