2014-03-25 23 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