Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кто-нибудь работал с либой jFreeChart ? не получатся рисовать j2D об. на графике 
V
    Опции темы
alex_smirnov
Дата 27.6.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 22.6.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 4



Если кто-то занимался этими делами, давайте подискутируем...
Для начала, как просто нарисовать Rectangle на созданном графике?

Мой код следующий, они нифига не работает....

Код

        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = image.createGraphics();
        g2.setColor(Color.red);
        g2.fill(new Rectangle2D.Double(1, 1, 100, 100));
        chart.draw(g2, new Rectangle(1, 1, 100, 100)); 

PM GTalk Jabber   Вверх
powerOn
Дата 28.6.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



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


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
alex_smirnov
Дата 28.6.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 22.6.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 4



Не то, что мне жалко код)))
Он уже под 1000 строк, выкладываю функцию загрузки графика, может на первый взгляд поймёшь, что не так...:
Код

private JFreeChart createChart() {
    
     /*
      * (re)loading data
      * */
     
     makeSeriesChange(0);
     
     /*
      * creating chart
      * */
     
     XYDataset priceData = new TimeSeriesCollection(_priceDataset);
        
        String title = _Ticker;
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
            title,
            "Date",
            "Price",
            priceData,
            true,
            true,
            false
        );
       
        XYPlot plot = chart.getXYPlot();
        NumberAxis rangeAxis1 = (NumberAxis) plot.getRangeAxis();
        rangeAxis1.setLowerMargin(0.40);  // to leave room for volume bars
        DecimalFormat format = new DecimalFormat("00.00");
        rangeAxis1.setNumberFormatOverride(format);

        XYItemRenderer renderer1 = plot.getRenderer();
        renderer1.setToolTipGenerator(
            new StandardXYToolTipGenerator(
                StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
                new SimpleDateFormat("MM-dd-yyyy"), new DecimalFormat("0.00")
            )
        );
        
        if (renderer1 instanceof XYLineAndShapeRenderer) {
            XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) renderer1;
            renderer.setBaseShapesVisible(false);
            renderer.setBaseShapesFilled(false);
        }
        
        NumberAxis rangeAxis2 = new NumberAxis("Volume");
        rangeAxis2.setUpperMargin(1.00);  // to leave room for price line
        plot.setRangeAxis(1, rangeAxis2);
        plot.setDataset(1, new TimeSeriesCollection(_volumeDataset));
        plot.setRangeAxis(1, rangeAxis2);
        
        plot.mapDatasetToRangeAxis(1, 1);
        XYBarRenderer renderer2 = new XYBarRenderer(0.20);
        renderer2.setToolTipGenerator(
            new StandardXYToolTipGenerator(
                StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
                new SimpleDateFormat("MM-dd-yyyy"), new DecimalFormat("0,000.00")
            )
        );
        plot.setRenderer(1, renderer2);

        
        // PAINT OVER CHART
        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = image.createGraphics();
        g2.setColor(Color.red);
        g2.fill(new Rectangle2D.Double(0, 0, 99, 99));
        chart.draw(g2, new Rectangle(1, 1, 20, 50)); 
        
        chart.getLegend().setPadding(1, 1, 1, 1);
        chart.getLegend().setMargin(-23, 210, 5, 10);
        chart.getLegend().setPosition(RectangleEdge.TOP);
        
        return chart;
    }


Добавлено через 8 минут и 22 секунды
Нашёл решение, но оно какое-то не такое)))
Получилось просто рисовать 2d компоненты поверх всего апплета, раньше был конфликт с чартом.

Вот, что работает:

Код

    public void paint(Graphics gr) {
     paintComponent(gr);
    }
    
    public void paintComponent(Graphics gr) {
        super.paintComponents(gr);
        Graphics2D g2 = (Graphics2D) gr;

        Line2D line = new Line2D.Double(0, 100, 500, 350);
        g2.draw(line);
    } 
    
    public void start(){
       .....
    }


Надеюсь, что с перерисовкой проблем не возникнет.


Идея - то в следующем: создать апплет, на котором мышой можно выбирать диапазон на графике, после выбора диапазона данные перегружаются и график перерисовывается. Всё уже сделано, сижу, бьюсь как раз над отрисовкой шлейфа за мышой, допустим линии...

Может есть какие-нить средства в jFreeChart'е которые сделают отрисовку проще?
Маркеры различные пробовал, но это жутко неудобно.
PM GTalk Jabber   Вверх
alex_smirnov
Дата 28.6.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 22.6.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 4



Хе, с перерисовкой по маус драгу проблем не возникло, зато возникло ощущение, что обьект не успевает за мышой при быстром её перемещении... может кто подскажет в чём может заключаться проблема? 

Код

public void mouseDragged(MouseEvent event){
         _mouseTrainX2 = event.getX();
         repaint();
     }


в paint() методе вызывается функция перерисовки с глобальными параметрами (координаты объекта).

Может можно это делать без такой заторможенности?

Вопрос об альтернативных вариантах (используя саму JFreeChart) всё ещё открыт smile
PM GTalk Jabber   Вверх
alex_smirnov
Дата 29.6.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 22.6.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 4



Сделал без тормозов:

1. рисовальную функцию прописал в методе маус листнера.
2. Отказался от метода repaint(); в этом самом методе (естесственно).
3. Скорость возросла. smile
4. Потом организовал страние по предыдущим координатам... и т.д.)))

Вдохновило чтение исходников JFreeChart'a... 
Не зря меня учил мой первый учитель Java: "Читайте доки, доки рулеззз", в данном случае рулезом оказались сорцы))) Ура!

Вопрос вобщем решён, видимо наилучшим способом)
PM GTalk Jabber   Вверх
Real McCoy
Дата 4.7.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: нет
Всего: 2



Цитата

 с перерисовкой по маус драгу проблем не возникло

Скажи, плз, а у Тебя нет проблем с автозумом чарта, когда по нему делается маус драг? У меня он всё портит, т.к. перед драгом один масштаб, после него - другой, и отрисовка получается не там и не такого размера, как надо.

У меня класс-контейнер, наследует ChartPanel, в конструкторе установлены  setDomainZoomable(false); и setRangeZoomable(false);
Создаю JFreeChart и устанавливаю его в контейнер;
к контейнеру  привязываю addMouseListener и addMouseMotionListener; рисую примерно так, как Ты в начале написал.

Рисовать, рисует, но и зумится тоже. Как Ты избегаешь зума?
PM MAIL   Вверх
alex_smirnov
Дата 4.7.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 22.6.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 4



Сорри, не заглядывал в тему, не слежу за ней уже )))

У меня как-то проблема не возникала(зум как-то я сразу отключил), но решение следующее:

Код

...
ChartPanel panel = new ChartPanel(chart);
...
panel.setMouseZoomable(false);
...


попробуй, не получится, дай знать )

удачи!
PM GTalk Jabber   Вверх
Real McCoy
Дата 4.7.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 28.6.2007

Репутация: нет
Всего: 2



Спасибо!
Я уже и сам до этого успел додуматься smile Оказалось, что при ChartPanel.setChart(JFreeChart) автоматически включаются DomainZoomable и RangeZoomable, и надо было просто выключать из после установки нового чарта в панель.
Всё равно, спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Апплеты | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.