Почему я не могу скопировать значение из одной XYSeriesCollection в другую?

1

Я использую 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. Что я делаю или предполагаю, что это неправильно?

Спасибо.

Теги:
swing
time
histogram
jfreechart

1 ответ

1
Лучший ответ

Обратите внимание на разницу между неглубокой и глубокой копией. Ваш пример, 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

Также рассмотрим представленный ниже подход, который может быть быстрее.

  • 0
    Спасибо большое, теперь работает отлично. Я пытался сделать гистограмму так, как говорит эта ссылка, но потом, когда я это сделал, я не могу показать один канал R, G или B, удалив серии из сбора данных, так как HistogramDataset не содержит метод remove. серии. Поэтому я решил написать все сам, пройдя через все пиксели, и для 17-мегапиксельной TIFF-фотографии и 16-битного цвета в MacBook Pro 2012 13 "это занимает около 4 секунд.
  • 0
    @nck: вместо изменения модели измените видимость ряда в представлении; VisibleAction является примером.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню