2014-03-25 28 views
0

在我的應用程序中,我加載一個包含數據的表。 在這個標籤中,一列來自一個web服務,它可以做出一些回答。 所以我把這個在池中的線​​程,以避免遮擋屏幕是這樣的:線程執行後刷新TableView

final ObservableList<StockListBean> list = FXCollections 
        .observableArrayList(); 
    list.addAll(stocksListMService.getStocksListRunning()); 
    stocksList.setItems(list); 

    final ExecutorService executor = Executors.newFixedThreadPool(4); 
    for (final StockListBean stockListBean : list) { 
     executor.execute(new Task<Float>() { 
     @Override 
     protected Float call() throws Exception { 
      logger.debug("In jfx task for {}", stockListBean.getCode()); 
((StockListRunningBean)stockListBean).setActualPrice(stocksListMService.getActualPrice(stockListBean.getCode())); 
       columnActualPrice.setVisible(false); 
       columnActualPrice.setVisible(true); 
       return 0f; 
      } 
      }); 
    } 

的線程以及執行和數據豆類以及設置,但我沒有達到刷新的tableView。 我嘗試快照中的代碼。我嘗試了很多在網上找到的其他方式,但沒有做任何事情,這個專欄非常空洞。

如果我保持線程循環,但不執行服務並設置默認值,則此列不爲空。

這是一個真正的屏幕刷新問題。

我該如何刷新?

謝謝。

回答

2

假設您的StockListRunningBean使用JavaFX可觀察屬性,以便TableView看到更改,則不需要額外執行任何操作來更新表。您的代碼存在的一個問題是,您正在從不是FX應用程序線程的線程更改UI(通過更改StockListRunningBean價格屬性)。

試試這個重構:

for (final StockListBean stockListBean : list) { 
    final int code = stockListBean.getCode(); // assuming int, change as required 
    final Task<Float> task = new Task<Float>() { 
     @Override 
     protected Float call() throws Exception { 
      logger.debug("In jfx task for {}", code); 
      return stocksListMService.getActualPrice(code); 
     } 
    }; 
    task.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
     @Override 
     public void handle(WorkerStateEvent event) { 
      ((StockListRunningBean)stockListBean).setActualPrice(task.getValue()); 
     } 
    }); 
    executor.execute(task); 
} 

再次,這假定你的StockListRunnerBean有 public FloatProperty actualPriceProperty() {...} 方法和表列正確綁定到它。

+0

我發現執行者不會拋出異常,只是關閉。如果您在try塊中包裝調用UI線程的方法,則可能會看到該錯誤。調試和查找線程錯誤的真正痛苦。 – brian

+0

如果發生異常,處理它們的方法是向任務註冊'setOnFailed'處理程序:task.setOnFailed(new EventHandler (){...});' –

+0

服務沒有異常拋出。我的stockListBean不是JFX可觀察的,因爲它被多個應用程序使用。我需要簡單的變量類型。該任務允許在FX應用程序線程中獲得線程。 – Kiva