Я использую JFreeChart для создания гистограммы изображения в java swing. Чтобы создать его, я перебираю все пиксели, чтобы получить все цвета. В зависимости от размера и глубины бит требуется некоторое время.
Как только у меня есть все данные, я помещаю их в переменную XYSeriesCollection. Чтобы иметь возможность показывать и скрывать некоторые серии, я сохраняю копию этой переменной.
Моя проблема в том, что если я сделаю это так:
final XYSeriesCollection data = createHistogram();
final XYSeriesCollection dataCopy = createHistogram();
Он работает без каких-либо проблем, но он неэффективен, поскольку я должен перебирать все пиксели, и это занимает некоторое время.
Если я просто скопирую его так:
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. Что я делаю или предполагаю, что это неправильно?
Спасибо.
Обратите внимание на разницу между неглубокой и глубокой копией. Ваш пример, dataCopy = data
, делает копию неглубокой. Используйте метод dataset clone()
, чтобы сделать глубокую копию:
XYSeriesCollection dataCopy = (XYSeriesCollection) data.clone();
Вы можете увидеть, как clone()
реализовано здесь. Фрагмент ниже создает серию, клонирует ее и обновляет оригинал, чтобы проиллюстрировать эффект.
код:
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
Также рассмотрим представленный ниже подход, который может быть быстрее.
VisibleAction
является примером.