Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Сохранение пропорции JFreeChart?


Автор: _Y_ 11.8.2007, 19:43
Это я из отпуска вернулся smile 

Задача сохранить заданную пропорцию ширина-высота у графика, рисуемого в JFreeChart. А именно: график предполагается весьма длинный, гораздо больше ширины экрана. JFreeChart сам по себе растягивается под контейнер. Хотелось бы, чтобы растягивался он только по вертикали, а по горизонтали его размер изменялся пропорционально. При этом, естественно, нужна горизонтальная полоса прокрутки.

Два варианта вопроса:
1. Может есть стандартное решение?
2. Если нет стандартного, то я бы попробовал сделать так:
  • В центр внешнего контейнера с BorderLayout поместил бы JScrollPane, а внутрь JScrollPane положил бы ChartPanel.
  • Слушал бы изменение размера внешнего контейнера и принудительно  пересчитывал бы размеры ChartPanel.
Что думаете о таком решении и чем/как слушается изменение размеров JInternalFrame? Что-то я запутался как их слушать и потому это решение пока не попробовал.

ЗЫ: Собственно, задача, наверное более общая и может применяться к растяжению-прокрутке любого контейнера, а не только ChartPanel.

Автор: w1nd 11.8.2007, 22:34
Я бы сделал свой LayoutManager, который поддерживал бы только один компонент и в зависимости от настроек масштабировал бы его. Этот layout manager устанавливается затем в панель, туда же добавляется компонент, а затем эту панель в JScrollPane.

Автор: Real McCoy 12.8.2007, 13:30
w1nd, 
А где можно почитать, как сделать свой LayoutManager?

_Y_, 
По поводу работы с контейнерами ничего не скажу, т.к. такую задачу решать не пробовал, а теоретизировать опыта маловато smile

По поводу самого JFreeChart, в смысле сохранения его пропорций могу сказать, что недавно решал подобную задачу. Решение сводилось к тому, чтобы самостоятельно посчитать, в каких границах по X и Y надо отрисовывать график, после чего полученные значения устанавливались диаграмме:

Код

    JFreeChart chart = ChartFactory.createScatterPlot("", "X", "Y", dataset,
          PlotOrientation.VERTICAL, false, true, false);

    XYPlot plot = (XYPlot)chart.getPlot();

    // ...

    // Set chart boundaries (rangeMinX, rangeMaxX, rangeMinY, rangeMaxY).
    NumberAxis numberaxisX = (NumberAxis)plot.getDomainAxis();
    numberaxisX.setRange(rangeMinX, rangeMaxX);

    NumberAxis numberaxisY = (NumberAxis)plot.getRangeAxis();
    numberaxisY.setRange(rangeMinY, rangeMaxY);

    // ...


У меня, кстати, за счёт выставления границ ещё и зумирование сделано smile

Автор: _Y_ 12.8.2007, 17:48
w1nd, а что свой LayoutManager должен делать? Что-то ничего в голову не приходит отличного от делаемого серединой BorderLAyout.


Real McCoy, Ваше решение вроде устанавливает граничные значения осей. Меня же установленные автоматически вполне устраивают. Нужно играть не с осями, а с размерами/растяжением всего изображения.

Автор: w1nd 12.8.2007, 18:13
Real McCoy, не знаю, где почитать. Я когда-то читал javadoc и исходники существующих layout'ов.
_Y_, такой layout должен только возвращать/устанавливать нужный размер ChartPanel. Чуть попозже постараюсь сделать пример, но не обещаю.

Автор: _Y_ 12.8.2007, 21:50
w1nd, спасибо. Это задача не срочная. Просто столкнулся с вопросом, на который не смог самому себе ответить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)