2014-05-07 22 views
1

我正在進行基本的Java FX任務練習。它從1到150在一個線程上計數。當前值顯示在標籤上並更新進度條。JavaFX任務不重新運行一次取消或完成一次

有一個按鈕可以啓動任務,取消它並查看任務的取消狀態。

讓我感到困惑的是,爲什麼在取消線程一次後我不能重新運行任務(如果我讓任務完成,也會發生同樣的事情)。

我希望能夠重新運行任務。然後我需要使它恢復(儘管在弄清楚如何重新運行任務之後不應該那麼難)

來源;

public class JavaFX_Task extends Application { 

@Override 
public void start(Stage primaryStage) { 

    final Task task; 
    task = new Task<Void>() { 
     @Override 
     protected Void call() throws Exception { 
      int max = 150; 
      for (int i = 1; i <= max; i++) { 
       if (isCancelled()) { 
        break; 
       } 
       updateProgress(i, max); 
       updateMessage(String.valueOf(i)); 

       Thread.sleep(100); 
      } 
      return null; 
     } 
    }; 

    ProgressBar progressBar = new ProgressBar(); 
    progressBar.setProgress(0); 
    progressBar.progressProperty().bind(task.progressProperty()); 

    Label labelCount = new Label(); 
    labelCount.textProperty().bind(task.messageProperty()); 

    final Label labelState = new Label(); 

    Button btnStart = new Button("Start Task"); 
    btnStart.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent t) { 

      new Thread(task).start(); 


     } 
    }); 

    Button btnCancel = new Button("Cancel Task"); 

    btnCancel.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent t) { 
      task.cancel(); 

     } 
    }); 

    Button btnReadTaskState = new Button("Read Task State"); 
    btnReadTaskState.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent t) { 
      labelState.setText(task.getState().toString()); 
     } 
    }); 


    VBox vBox = new VBox(); 
    vBox.setPadding(new Insets(5, 5, 5, 5)); 
    vBox.setSpacing(5); 
    vBox.getChildren().addAll(
      progressBar, 
      labelCount, 
      btnStart, 
      btnCancel, 
      btnReadTaskState, 
      labelState); 

    StackPane root = new StackPane(); 
    root.getChildren().add(vBox); 

    Scene scene = new Scene(root, 300, 250); 

    primaryStage.setTitle("java-buddy.blogspot.com"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 

} 

public static void main(String[] args) { 
    launch(args); 
} 

}

回答

0

Task documentation是對這個很清楚。

FutureTask一樣,Task是一次性類,不能重複使用。有關可重用的Worker,請參閱Service

在服務文檔中有一個可重啓的併發服務的例子。

+0

哇,我現在感覺像一個延遲:(... – user3612698

+0

沒有必要這樣感覺。作爲第一個問題,你的比許多:-) – jewelsea

相關問題