Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有JavaFXProgressBar行为的Pb_Java_Javafx - Fatal编程技术网

具有JavaFXProgressBar行为的Pb

具有JavaFXProgressBar行为的Pb,java,javafx,Java,Javafx,当我第一次启动与进度条绑定的任务时,进度条开始倒带,然后重新启动,这一次是根据我的计数器(正如我预期的那样)。这种不必要的影响是非常微妙的,但却是显而易见的 下面是我的测试代码: private void startButtonEventHandler(ActionEvent event) { Service<Void> service = new Service<Void>() { @Override protected Task<Void> cr

当我第一次启动与进度条绑定的任务时,进度条开始倒带,然后重新启动,这一次是根据我的计数器(正如我预期的那样)。这种不必要的影响是非常微妙的,但却是显而易见的

下面是我的测试代码:

private void startButtonEventHandler(ActionEvent event) {
 Service<Void> service = new Service<Void>() {
  @Override
  protected Task<Void> createTask() {

   Task<Void> task = new Task<Void>() {
    @Override
     public Void call() throws Exception {
      for (int i = 1; i <= 10; i++) {
       // Long running task ...
       Thread.sleep(500);
       updateProgress(i, 10);
      }

      return null;
     }
    };

    progressBar.progressProperty().bind(task.progressProperty());
    return task;
   }
  };

  service.start();
}

更新:我意识到progressBar在开始时以待定模式启动,然后在第一次调用updateProgress()方法后,它切换到确定模式。这是错误还是功能?

任务的初始进度是
-1
(即不确定)。(这很有意义,因为默认情况下任务不知道需要多长时间…)因此,当您将进度条的进度绑定到任务的进度时,进度条将变得不确定

创建任务时,只需将其进度设置为0:

protected Task<Void> createTask() {

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

        {
            updateProgress(0, 10);
        }     

        @Override
        public Void call() throws Exception {
             for (int i = 1; i <= 10; i++) {
                 // Long running task ...
                 Thread.sleep(500);
                 updateProgress(i, 10);
             }

             return null;
        }
     };

     progressBar.progressProperty().bind(task.progressProperty());
     return task;
}
受保护的任务createTask(){
任务=新任务(){
{
updateProgress(0,10);
}     
@凌驾
public Void call()引发异常{

对于(int i=1;在启动服务之前,您是否尝试将进度条的进度属性绑定到服务的进度属性,而不是
progressBar.progressProperty().bind(task.progressProperty())
?是的,但它并没有解决这个奇怪的行为。哦,还没有…仍然是那个恼人的效果。有时还可以,有时会出现不确定的状态(我说每两次尝试一次)。我尝试了你的更新,但没有改变任何东西。同时,我在我的家用计算机上尝试了这个代码(下面是同一个JDK 8.121 64)这一次,无论我运行多少次,都没有可见的不确定状态可见。我的家用计算机内部有一个Core i7 i7-7700K Kaby Lake处理器,我的工作计算机运行在旧的Core i5代上,我相信这可以解释整个差异。然而,我倾向于相信这是一个JavaFX错误,可能会继续存在不被当今快速处理器所注意。
protected Task<Void> createTask() {

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

        {
            updateProgress(0, 10);
        }     

        @Override
        public Void call() throws Exception {
             for (int i = 1; i <= 10; i++) {
                 // Long running task ...
                 Thread.sleep(500);
                 updateProgress(i, 10);
             }

             return null;
        }
     };

     progressBar.progressProperty().bind(task.progressProperty());
     return task;
}