отображать jfreecharts с помощью сервлетов - PullRequest
1 голос
/ 04 июля 2011

У меня есть сценарий, в котором мне нужно отобразить диаграммы (сгенерированные с использованием jfreecharts), преобразовать их в изображение png, а затем отобразить их с помощью сервлетов.

Когда код диаграммы расширяет либо ApplicationFrame, либо Jframe, я вижу следующееИсключение, когда я отображаю его с помощью сервлетов:

java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.(Window.java:317)
at java.awt.Frame.(Frame.java:419)
at javax.swing.JFrame.(JFrame.java:194)

Я прочитал несколько мест, и это, кажется, из-за ApplicationFrame и JFrame вызовет эту ошибку.

Если я передам толькообъект диаграммы это бросает

java.lang.IllegalArgumentException: Null 'chart' argument.
    org.jfree.chart.ChartUtilities.writeChartAsPNG(ChartUtilities.java:181)
    org.jfree.chart.ChartUtilities.writeChartAsPNG(ChartUtilities.java:136)

Есть ли какое-то решение для этого?

Ответы [ 2 ]

1 голос
/ 06 декабря 2012

Я объясню вам простым способом, поскольку я столкнулся с той же проблемой, что и я был новым.

Шаги

  1. Создание сервлета
  2. В doPost создайте выходной поток
  3. установить тип контента в text / png
  4. Создать наборы данных
  5. установить значения в набор данных
  6. создать экземпляр jfreechart и вызвать createchart (диаграмму, которую вы хотите использовать)) используя ChartFqactory.
  7. наконец вызовите WriteChartAsPNG с помощью ChartUtilities и передайте экземпляр Jfreechart, outputtream, width, height.

DONE:

Пример ниже

 package polo;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;


/**
 * Servlet implementation class PieChartDemo1Serv
 */
public class PieServ extends HttpServlet implements useme {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public PieServ() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        response.setContentType("image/png");   

        ServletOutputStream out = response.getOutputStream();

        DefaultPieDataset pieDataset = new DefaultPieDataset();

        pieDataset.setValue("In-Network ", .80);

        pieDataset.setValue("Out-of-Network ", .20);



        JFreeChart chart = ChartFactory.createPieChart("", pieDataset, true, true, false);

ChartUtilities.writeChartAsPNG(out, chart, 202, 182);
    System.out.println("done23");

    }


}

Теперь я знаю, что дальше. Изучите Pieplots / Legends для настройки границы и форматирования. Вы можете сделать гораздо больше.

1 голос
/ 04 июля 2011

ChartUtilities - правильный выбор;потоки тоже поддерживаются.Один подход требует Использование режима без головы в платформе Java SE , но я также получил его для работы с VNC.

Добавление: вот соответствующий форум нить .

...