2016-11-11 47 views
0

JavaFX使用可观察列表作为其图表系列。我想从一个不同的线程加载系列中的数据,我通过使用Task和Platform.runLater来完成。然而,UI仍然不是非常敏感,数据看起来并不顺利,未来从JavaFX中的另一个线程加载图表系列中的数据

我想以下情况发生:

  • 用户界面保持响应。
  • 数据在图形中平滑地加载 - 每个系列一次一个。操作

    订单:

    1. 加载页面
    2. 装入空图表系列在图表
    3. 按生成按钮
    4. 将数据加载到每个系列

相关部分代码:

负载串联成图表

private static ObservableList<XYChart.Series<Number, Number>> pathSeries = FXCollections.observableArrayList();  

final LineChart<Number,Number> pathChart = 
      new LineChart<Number,Number>(xAxis,yAxis); 

    for (int n=0; n<proc.getNumPath(); n++) 
    { 
     pathSeries.add(new Series<Number, Number>()); 
    } 

    pathChart.getData().addAll(pathSeries); 

载荷数据系列

Task task = new Task<Void>() { 
    @Override public Void call() { 

     // PATH SERIES 
     for (int n=0; n<proc.getNumPath(); n++) 
     { 
      for(int i=0; i<=proc.getM(); i++) 
      { 
       int pathNumber = n; 
       int dataIndex = i; 

       Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         pathSeries.get(pathNumber).getData().add(new XYChart.Data<Number, Number>(proc.getT()[dataIndex], 
           proc.getX()[pathNumber][dataIndex])); 
        } 
       }); 
       if (isCancelled()) { 
        updateMessage("Cancelled"); 
        break; 
       } 
      } 
     } 
     return null; 
    } 
}; 

@FXML 
public void initialize(){ 

    generateButton.setOnAction(e -> { 
     pathWorker = new Thread(task); 
     pathWorker.setDaemon(true); 
     pathWorker.start(); 
    }); 
} 

我怎样才能提高我的代码没有得到太复杂?

enter image description here

+1

你可能不会喜欢这个评论,但是这看起来像是大量的数据。图表API(imho)并不是真正为这种规模的数据设计的,您可能会发现需要使用画布来滚动您自己的实现(例如,使用画布)以获得具有大量数据的响应式UI。基本问题是每个数据点由场景图中的节点表示,并且每个节点都有大量的属性,其外观由相当昂贵的CSS代码控制。你可以尝试一些东西 - 例如关闭图表上的动画 - 但这可能是太多的数据。 –

+0

我想调用Thread.sleep(100);将有助于GUI响应。玩数字。您的数据将需要更长的时间才能加载。 – Sedrick

回答

0

使用这里面的for循环。

Thread.sleep(100); 
相关问题