2015-04-24 22 views
1

我們有一個java程序,它接收一個CSV文件並將其處理成多組數據。數據在帶有組合框的XYChart上一次顯示一個以在它們之間進行選擇。然而,我們仍然遇到更新/更改數據的問題:JavaFX圖表:切換系列數據的正確方法

首先,我們爲每個數據系列有一堆ObservableList對象,例如,

ObservableList<XYChart.Data<T,V>> data = FXCollections.observableArrayList(); 

並且每當ChoiceBox選擇被改變時,我們將清除該系列並添加對應於不同選擇的一個,例如,

theChart.getData().clear(); 
theChart.getData().add(new XYChart.Series<T,V>(data)); 

然而,當data被更新說着有關添加到多個圖表相同的數據,我們會得到錯誤。我認爲這會發生,如果theChart.getData().add(new XYChart.Series<T,V>(data));已被事先調用相同的data兩次。

所以我把它包起來像

XYChart.Series<T,V> series = new XYChart.Series<>(data); 

,改變圖表數據,如:

theChart.getData().clear(); 
theChart.getData().add(series); 

data被清除我的計算機上,但在另一個工作正常,然後add版來我們得到在事件期間出現空指針異常,這表明某種競爭條件。

問題:

  • 什麼是正確什麼改變一系列一個JavaFX圖表顯示?
  • 有沒有辦法'暫停'onChanged事件,以便整個數據系列可以在圖表嘗試重繪之前更新。
+1

您是否正在創建自己的線程,或者您是否始終使用JavaFX系統提供的應用程序線程?您是將JavaFX和Swing混合在一起還是純JavaFX應用程序?你可以提供一個[mcve](http://stackoverflow.com/help/mcve)來複制你的問題嗎?你使用的是什麼版本的JavaFX和OS?所有機器是否都使用完全相同的JavaFX版本並運行相同的操作系統? – jewelsea

+0

請提供演示問題的SSCCE – kleopatra

+0

@jewelsea 1.更新圖表是使用Platform.runLater從另一個線程調用的。2.純JavaFX 3.我將嘗試創建mcve 4. javafx.runtime.version = 8.0.20 ,OS = OS X 10.10,java version = build 1.8.0_20-b26 5.應該是相同的java版本,錯誤的機器是舊版本的OS X. – geometrikal

回答

1

你不能做一個clear(),這將拋出一個UnsupportedOperationException。更新圖表的正確方法是設置新的空白ObservableList,然後將新的XYChart.Series與適當的XYChart.Data對象一起添加到中。

chart.setData(FXCollections.observableArrayList()); 
XYChart.Series<T, V> series = new XYChart.Series<T, V>(); 
XYChart.Data<T, V> data = new XYChart.Data<T, V>(t_type_Value, v_type_Value); 

series.getData().add(data); 

chart.getData().add(series);