Альтернатива JFreechart - PullRequest
1 голос
/ 23 марта 2011

Я использую JFreeChart в одном из моих java-приложений, но проблема в том, что он заново рисует всю диаграмму, когда вы вносите какие-либо изменения в модель диаграммы.

Я знаю, что мы можем удалить ChartChangeListenerи добавьте их в соответствии с нашими потребностями, чтобы он не запускал chartChangeEvent каждый раз, но это не решило мою проблему.

В моем случае XYSeries выходит за границы диаграммы на оси X.Видимая ось X составляет 6 см.Поэтому, когда ряд выходит за пределы 6 см, я отбрасываю исходные видимые данные на 1 см и снова строю данные на следующих 6 см.

В этом случае он начинает мигать.

1 Ответ

0 голосов
/ 17 марта 2012

Построение только видимой области - неправильная идея. Как правило, вы действительно хотите создать BufferedImage, который будет содержать всю диаграмму, и тогда вам не нужно перекрашивать всю диаграмму 1000 раз в секунду. Если вы не можете буферизовать всю диаграмму (например, вы строите данные в режиме реального времени), вы должны по крайней мере сохранить ее для буферизации одной точки, если она больше 1px. Заполнение фигур - очень дорогая операция в Java.

Следующий код ужасно медленный (при построении слишком большого количества точек)

   for(int x=0; x < max; x++){
     Ellipse2D.Double ellipse = new Ellipse2D.Double(x - 1.5, f(x) -1.5, 3, 3);
     g.setPaint(color);
     g.draw(ellipse);
     g.fill(ellipse);
   }

Должен быть заменен на

   private BufferedImage createBufferedImage(Color color) {
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D buff = bufferedImage.createGraphics();
        Ellipse2D.Double ellipse = new Ellipse2D.Double(0, 0, 3, 3);
        buff.setPaint(color);
        buff.draw(ellipse);
        buff.fill(ellipse);
        return bufferedImage;
    }

   AffineTransform at = new AffineTransform();
   at.scale(1, 1);
   createBufferedImage(Color.RED);
   for(int x=0; x < max; x++){
            at.setToIdentity();
            at.translate(x - 2, y - 2);
            g.drawImage(bufferedImage, at, null);
   }

, который делает то же самое, только во много раз быстрее. AFAIK в JFreeChart, они не используют буферизацию должным образом, что является одной из причин, почему это так медленно.

...