2012-05-16 2 views
1

Я хотел бы сделать гистограмму JFreeChart, которая поддерживает постоянное количество ящиков при масштабировании и выводе. Например, возможно, увеличенный вылет через 12 лет, и каждый год будет 1 бит. Когда вы увеличите немного больше, вы увидите 12 месяцев, и каждый месяц будет бит. Масштабирование еще больше, возможно, есть 1 бит на каждый день, каждый час и т. Д. Они не должны быть такими чистыми размерами бункера, но вы получаете идею.Гистограмма JFreeChart с постоянным количеством ящиков при масштабировании

Я использую HistogramDataset.addSeries, чтобы добавить данные на гистограмму. Параметр bins - это количество ящиков для всего набора и не учитывает масштабирование.

Я заметил, что могу использовать ChartPanel и переопределять его метод zoom. Здесь я мог бы потенциально изменить количество ящиков. Тем не менее, мне сложно определить, где я могу изменить количество ящиков и их изменение.

EDIT:

Есть несколько частей этой проблемы, что я заинтересован в том, что я считаю, имеет решающее значение для решения:

  1. Как лучше сказать, что пользователь в увеличенном виде. Мой текущий подход заключается в переопределении zoom.
  2. Как определить границы, на которые пользователь увеличил масштаб. Я все еще не уверен, как это сделать.
  3. Как изменить количество ячеек в модели данных, чтобы масштабирование поддерживало то же количество , показанное.

Для некоторого контекста, моя конечная цель заключается в создании финансового контроля в стиле Google: Google Finance style control for Java?

ответ

1

Чтобы ответить на мои конкретные вопросы выше:

  1. Я продолжал переопределить масштабирование на ChartPanel класса.
  2. Чтобы определить диапазон, который пользователь увеличил до значения, я использовал нижеуказанные функции и ratioToModel, так как функции масштабирования задают координаты окна.
  3. Чтобы изменить количество ящиков, я фактически сохранил количество ящиков одинаково и просто изменил набор данных, переданный в диаграмму. Я использовал SortedMap для моей модели данных, из которой я мог бы легко получить subMap.

Функции:

private double windowToRatio(double window) { 
    Rectangle2D scaledDataArea = getScreenDataArea(); 
    return (window - scaledDataArea.getMinX())/scaledDataArea.getWidth(); 
} 

private double ratioToModel(double ratio) { 
    Range domainRange = getChart().getXYPlot().getDomainAxis().getRange(); 
    return domainRange.getLowerBound() + ratio * domainRange.getLength(); 
} 
2

Перегрузки функция масштабирования привлекательным, но, возможно, сбивает с толку. В качестве альтернативы рассмотрим добавление элемента управления, который обновляет модель данных, как показано в этом example. Экземпляры enum особенно удобны для заполнения JComboBox, как показано на рисунке here.

+0

Я не уверен, я полностью понимаю, что вы предлагаете здесь. Я мог бы добавить еще один элемент управления, но я не хочу, если мне это не нужно. Зачем пользователю делать 2 вещи (изменять масштаб и менять поле со списком), когда они могут просто сделать 1 (увеличение)? Предположим, что я показываю гистограмму с данными за период с 2001 по 2011 год с 10 бункерами, а затем с апреля 2003 года по июль 2003 года пользователь увеличит масштаб. В результате набора данных будет отображаться только 1 бит (если есть).Я хотел бы разбить его на 10 * новых * бункеров. Я не уверен, как любой из этих примеров поможет мне обработать этот масштаб и решить проблему. Может быть, я что-то упустил. – Luke

+0

Нет, ваше понимание верное; примеры относятся только к альтернативе, которую я предлагаю. В любом случае вам нужно будет обновить модель, независимо от того, контролируется ли это обновление комбо или жест увеличения. Сначала я разработал базовую функциональность, а затем разоблачил ее, используя сначала более простой подход. – trashgod