2016-11-09 64 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

相关问题