2014-02-23 36 views
0

我想用setOnSucceeded監聽器來實現JavaFX任務。setOnSucceeded不叫

class GetDailySalesTask extends Task<ObservableList<VBox>> 
    { 

     @Override 
     protected ObservableList<VBox> call() throws Exception 
     { 
      TabContentInfrastructure content = new TabContentInfrastructure(); 
      return FXCollections.observableArrayList(content.initTestTabContentData()); 
     } 
    } 

而且我在這裏調用Java類:

VBox vb = new VBox(); 

Task<ObservableList<VBox>> task = new GetDailySalesTask(); 

Region veil = new Region(); 
veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)"); 
veil.setPrefSize(240, 160); 
ProgressIndicator p = new ProgressIndicator(); 
p.setMaxSize(140, 140); 

//p.progressProperty().bind(service.progressProperty()); 
veil.visibleProperty().bind(task.runningProperty()); 
p.visibleProperty().bind(task.runningProperty()); 
//vb.visibleProperty().bind(service.runningProperty().not()); 
//tableView.itemsProperty().bind(service.valueProperty()); 

StackPane stack = new StackPane(); 

System.out.println("service.valueProperty() = " + task.valueProperty()); 

task.setOnSucceeded(new EventHandler<WorkerStateEvent>() 
{ 
    @Override 
    public void handle(WorkerStateEvent t){ 

     System.out.print("Yes**********" + t.getSource().getValue()); 
     stack.getChildren().clear(); 
     t.getSource().getValue(); 
     stack.getChildren().addAll(task.getValue().get(0)); 


    } 
}); 



task.setOnFailed(new EventHandler<WorkerStateEvent>() 
{ 
    @Override 
    public void handle(WorkerStateEvent t){ 

     System.out.print("Entered setOnFailed**********" + t.getSource().getValue()); 



    } 
}); 



stack.getChildren().addAll(vb, veil, p); 

tabdata.setContent(stack); 
new Thread(task).start(); 

,由於某種原因setOnSucceeded不叫。你能幫我解決這個問題嗎?

P.S

public class TabContentInfrastructure 
{ 

    public VBox initTestTabContentData() throws InterruptedException 
    { 

     Thread.sleep(5000); 
     final VBox vbox = new VBox(0); 
     FlowPane flow = new FlowPane(); 
     ........................ 
     vbox.getChildren().addAll(flow, screenController); 
     return vbox;  
    } 
} 
+0

註冊setOnFailed(或在您的調用中使用try-catch)以查看是否拋出了Exception。 –

+0

我更新了代碼。當我運行代碼時,我總是得到'輸入setOnFailed **********'。我如何進一步調試? –

+0

我只得到'輸入setOnFailed ********** null'。我必須放置try/catch塊? –

回答

2

ü必須清除,

JavaFX應用程序線程和輔助線程是完全不同的。

您必須先閱讀本教程。 docs