【问题标题】:How to return a Task and use to update the progressbar in javafx如何返回任务并用于更新 javafx 中的进度条
【发布时间】:2015-08-15 06:29:07
【问题描述】:

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

这是我尝试过的

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

上面的代码写在main里

方法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() 时。有人可以帮我解决这个问题。任何帮助表示赞赏。

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    怎么了

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

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

    如何修复

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

    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

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

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

    【讨论】:

    • 非常感谢。我认为问题出在任务上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多