2016-11-09 71 views
1

我使用JFreeChart在java swing中創建圖像直方圖。爲了創建它,我遍歷所有像素以獲得所有顏色。取決於大小和位深度,它需要一些時間。爲什麼我不能將一個XYSeriesCollection的值複製到其他地方?

一旦我把所有的數據放到一個XYSeriesCollection變量中。爲了能夠顯示和隱藏一些後面的內容,我保存了該變量的副本。

我的問題是,如果我不喜歡這樣寫道:

​​

這工作沒有任何問題,但它是沒有效率的,因爲我不得不遍歷所有像素,並需要一段時間。

如果我只是複製這樣的:

final XYSeriesCollection data = createHistogram(); 
final XYSeriesCollection dataCopy = data; 

當我執行的代碼,我得到這個異常:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Series index out of bounds 
at org.jfree.data.xy.XYSeriesCollection.getSeries(XYSeriesCollection.java:263) 

我認爲,這是因爲當我刪除數據的一些系列他們如何從dataCopy中刪除,但不應該完全不同?我只是這個方法的工作:

data.removeAllseries(); 
data.addSeries(dataCopy.getSeries(index)); 

例如,如果我創建:

int x = 5; 
int y = x; 
x=0; 
System.out.println(y) 

輸出應該仍然是5,它並不無論我做什麼用X。我在做什麼或者認爲是錯誤的?

謝謝。

回答

1

請注意區別shallow versus deep copy。你的例子,dataCopy = data,做一個shallow副本。使用DataSet的clone()方法做出deep副本:

​​

你可以看到如何clone()實現here。下面的片段創建一個系列,克隆它,並更新原始文件以說明效果。

代碼:

XYSeriesCollection data = new XYSeriesCollection(); 
XYSeries series = new XYSeries("Test"); 
data.addSeries(series); 
series.add(1, 42); 
System.out.println(data.getSeries(0).getY(0)); 
XYSeriesCollection dataCopy = (XYSeriesCollection) data.clone(); 
series.updateByIndex(0, 21.0); 
System.out.println(data.getSeries(0).getY(0)); 
System.out.println(dataCopy.getSeries(0).getY(0)); 

控制檯:

42.0 
21.0 
42.0 

還要考慮here所示的方法,這可能會更快。

+0

非常感謝,現在完美無缺。我一直在試圖做這樣的鏈接直方圖說,但是一旦我做完了,我不能通過從數據收集中刪除系列來顯示單個R,G或B通道,因爲HistogramDataset不包含方法刪除系列。因此,我決定自己編寫一切,遍歷所有像素,並在macbook pro 2012 13中爲每張17Mpx的TIFF照片和每種顏色16位創建一個「大約需要4秒的時間」 – nck

+0

@nck:改變模型,而不是改變模型視圖中一系列的可見性; ['VisibleAction'](http://stackoverflow.com/a/11895709/230513)就是一個例子。 – trashgod

相關問題