我正在尝试更新添加到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()
。有人可以帮我这个。任何帮助表示赞赏。
答案 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。