我有一个场景,需要显示图表(使用jfreecharts生成(,将其转换为png图像,然后使用servlet显示。
当图表代码扩展ApplicationFrame或Jframe时,当我使用servlet显示它时,我会看到以下异常:
java.awt.HeadlessException:没有设置X11 DISPLAY变量,但是这个程序执行了一个需要它的操作。位于java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnviironment.java:159(在java.awt.Window.(Window.java:317(在java.awt.Frame.(Frame.java:419(位于javax.swing.JFrame.(JFrame.java:194(
我读了几个地方,这似乎是因为ApplicationFrame和JFrame会导致这个错误。
如果我只通过图表对象,就会抛出
java.lang.IollegalArgumentException:"chart"参数为Null。org.jfree.chat.ChartUtilities.writeChartAsPNG(ChartUtilities.java:181(org.jfree.chat.ChartUtilities.writeChartAsPNG(ChartUtilities.java:136(
有什么解决办法吗?
ChartUtilities
是正确的选择;流也是受支持的。一种方法需要在Java SE平台中使用Headless Mode,但我也使用了VNC。
附录:这里有一个相关的论坛帖子。
我将以简单的方式向您解释,因为我在新的时候遇到了同样的问题。
步骤
- 创建servlet
- 在doPost中创建输出流
- 将内容类型设置为text/png
- 创建数据集
- 将值设置到数据集
- 创建jfreechart的实例,并使用ChartFqactory调用createchart(您想要使用的图表(
- 最后使用ChartUtilities调用WriteChartAsPNG,并传递Jfreechart实例、outputstream、width和height
完成:
以下的样本
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");
}
}
现在我更了解你了。研究饼图/图例以设置边框和格式。你可以做得更远。