`

利用JFrame直接显示JFreeChart的图片

阅读更多
核心代码就是要将一个JFreeChart 对象,写到BufferedImage中。JFreeChart 中没有提供类似getImage(), getBufferedImage()方法,而是提供了一个createBufferedImage方法。

在这个例子中,您还可以找到如何解决JFreeChart的时间乱码问题。

JFreeChart chart = createChart(data);

BufferedImage image = chart.createBufferedImage(800, 300,
BufferedImage.TYPE_INT_RGB, null);


所有源码可以在附件中找到, 需要依赖JFreeChart的Jar包。 其余就是自己改改包路径,相信这个没啥难度。就两个类,一个用于处理JFrame和JFreeChart的逻辑,一个用于画图。

TimeCharttest
package com.abczww.test.t1;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.text.SimpleDateFormat;

import javax.swing.JFrame;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.ValueMarker;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Month;
import org.jfree.data.time.Quarter;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;

public class TimeCharttest extends JFrame {

	private static final long serialVersionUID = 2319942903676246265L;

	private ImagePanel imagePanel = new ImagePanel();

	private TimeCharttest() throws IOException {
		XYDataset data = createDataset();
		JFreeChart chart = createChart(data);

		BufferedImage image = chart.createBufferedImage(800, 300,
				BufferedImage.TYPE_INT_RGB, null);

		imagePanel.setImage(image);
		Container con = this.getContentPane();
		con.add(imagePanel, BorderLayout.CENTER);

		this.setSize(900, 400);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) throws IOException {
		new TimeCharttest();
	}

	private static XYDataset createDataset() {
		TimeSeries timeseries = new TimeSeries("L&G 欧洲调查");
		timeseries.add(new Month(2, 2001), 181.8D);// 这里用的是Month.class,同样还有Day.class
		// Year.class 等等
		timeseries.add(new Month(3, 2001), 167.3D);
		timeseries.add(new Month(4, 2001), 153.8D);
		timeseries.add(new Month(5, 2001), 167.6D);
		timeseries.add(new Month(6, 2001), 158.8D);
		timeseries.add(new Month(7, 2001), 148.3D);
		timeseries.add(new Month(8, 2001), 153.9D);
		timeseries.add(new Month(9, 2001), 142.7D);
		timeseries.add(new Month(10, 2001), 123.2D);
		timeseries.add(new Month(11, 2001), 131.8D);
		timeseries.add(new Month(12, 2001), 139.6D);
		timeseries.add(new Month(1, 2002), 142.9D);
		timeseries.add(new Month(2, 2002), 138.7D);
		timeseries.add(new Month(3, 2002), 137.3D);
		timeseries.add(new Month(4, 2002), 143.9D);
		timeseries.add(new Month(5, 2002), 139.8D);
		timeseries.add(new Month(6, 2002), 137D);
		timeseries.add(new Month(7, 2002), 132.8D);
		TimeSeries timeseries1 = new TimeSeries("L&G 韩国调查");
		timeseries1.add(new Month(2, 2001), 129.6D);
		timeseries1.add(new Month(3, 2001), 123.2D);
		timeseries1.add(new Month(4, 2001), 117.2D);
		timeseries1.add(new Month(5, 2001), 124.1D);
		timeseries1.add(new Month(6, 2001), 122.6D);
		timeseries1.add(new Month(7, 2001), 119.2D);
		timeseries1.add(new Month(8, 2001), 116.5D);
		timeseries1.add(new Month(9, 2001), 112.7D);
		timeseries1.add(new Month(10, 2001), 101.5D);
		timeseries1.add(new Month(11, 2001), 106.1D);
		timeseries1.add(new Month(12, 2001), 110.3D);
		timeseries1.add(new Month(1, 2002), 111.7D);
		timeseries1.add(new Month(2, 2002), 111D);
		timeseries1.add(new Month(3, 2002), 109.6D);
		timeseries1.add(new Month(4, 2002), 113.2D);
		timeseries1.add(new Month(5, 2002), 111.6D);
		timeseries1.add(new Month(6, 2002), 108.8D);
		timeseries1.add(new Month(7, 2002), 101.6D);

		TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
		timeseriescollection.addSeries(timeseries);
		timeseriescollection.addSeries(timeseries1);

		// timeseriescollection.setDomainIsPointsInTime(true); //
		// domain轴上的刻度点代表的是时间点而不是时间段

		return timeseriescollection;

	}

	// 2、由ChartFactory 产生 JFreeChart 对象
	private static JFreeChart createChart(XYDataset xydataset) {
		JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("L&G单位价格调查",
				"日期", "价格/单位", xydataset, true, true, false);
		jfreechart.setBackgroundPaint(Color.white);
		XYPlot xyplot = (XYPlot) jfreechart.getPlot(); // 获得 plot : XYPlot!!
		xyplot.setBackgroundPaint(Color.lightGray);
		xyplot.setDomainGridlinePaint(Color.white);// 网格的颜色
		xyplot.setRangeGridlinePaint(Color.white);// 网格的颜色

		xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
		xyplot.setDomainCrosshairVisible(true);
		xyplot.setRangeCrosshairVisible(true);

		ValueAxis categoryaxis = xyplot.getDomainAxis(); // 横轴上的

		categoryaxis.setPositiveArrowVisible(true);// 增加横轴的箭头
		xyplot.getRangeAxis().setPositiveArrowVisible(true);// 增加纵轴的箭头
		categoryaxis.setTickLabelFont(new Font("SansSerif", 10, 12));// 设定字体、类型、字号

		// 一些重要的方法:
		// A、增加标记线:
		xyplot.addRangeMarker(new ValueMarker(550D)); // 数值轴
		Quarter quarter = new Quarter(2, 2002);
		xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); // 时间轴
		// xyplot.setRangeGridlinePaint(Color.blue);

		// -----------------------

		org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = xyplot
				.getRenderer();
		if (xyitemrenderer instanceof XYLineAndShapeRenderer) {
			XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyitemrenderer;
			xylineandshaperenderer.setBaseShapesVisible(true); // 数据点可见
			xylineandshaperenderer.setBaseShapesFilled(true); // 数据点是实心点

		}
		// B、数据点的调整
		XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot
				.getRenderer();
		xylineandshaperenderer.setBaseShapesVisible(true); // 数据点可见
		xylineandshaperenderer.setSeriesFillPaint(0, Color.red); // 数据点填充为红色
		xylineandshaperenderer.setSeriesFillPaint(1, Color.white); // 数据点填充为白色
		xylineandshaperenderer.setUseFillPaint(true); // 应用

		DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis(); // 对domain
		// 轴上日期显示格式定义
		dateaxis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));

		// 解决中文乱码问题,共要处理这三部分
		// 1、对标题
		Font font1 = new Font("SimSun", 10, 20); // 设定字体、类型、字号
		jfreechart.getTitle().setFont(font1); // 标题

		// 2、对图里面的汉字设定,也就是Plot的设定
		Font font2 = new Font("SimSun", 10, 16); // 设定字体、类型、字号
		xyplot.getDomainAxis().setLabelFont(font2);// 相当于横轴或理解为X轴
		xyplot.getRangeAxis().setLabelFont(font2);// 相当于竖轴理解为Y轴

		// 3、下面的方块区域是 LegendTitle 对象
		Font font3 = new Font("SimSun", 10, 12); // 设定字体、类型、字号
		jfreechart.getLegend().setItemFont(font3);// 最下方

		return jfreechart;

	}

}


ImagePanel
package com.abczww.test.t1;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class ImagePanel extends JPanel {

	private static final long serialVersionUID = 4644786195524096243L;

	private BufferedImage image;

	public ImagePanel() {
		super();
	}

	public void setImage(BufferedImage image) {
		this.image = image;
	}

	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.white);

		// img = Toolkit.getDefaultToolkit().getImage("C:\\test.jpg");
		if (null != image) {
			this.setSize(image.getWidth(this), image.getHeight(this));
			g.fill3DRect(0, 0, image.getWidth(this), image.getHeight(this),
					true);
			g.drawImage(image, 0, 0, null, this);
			setPreferredSize(new Dimension(image.getWidth(this),
					image.getHeight(this)));
		}
	}

}

  • src.zip (2.8 KB)
  • 下载次数: 34
分享到:
评论

相关推荐

    java--JFreeChartDemo

    4. **创建ChartPanel**:ChartPanel是JFreeChart显示图表的组件,它可以嵌入到Swing应用的 JFrame 或 JDialog 中。`ChartPanel chartPanel = new ChartPanel(chart);` 5. **显示图表**:最后,将ChartPanel添加到...

    jfreechart小项目

    本项目是基于 JFreeChart 创建的一个小型应用,下载解压后即可直接运行,便于快速了解和学习 JFreeChart 的用法。 **1. JFreeChart 库的引入** 在 Java 项目中使用 JFreeChart,首先需要将其依赖引入到项目中。通常...

    jfreechart 折线图的一个例子

    例如,你可能会遇到如何动态更新数据、导出图表为图片、在 Web 应用中集成 JFreeChart 等问题,这些都是 JFreeChart 在实际项目中的常见应用场景。通过不断实践和探索,你将能够充分利用 JFreeChart 提供的强大功能...

    JFreeChart 教程和例子

    JFrame frame = new JFrame("JFreeChart Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new ChartPanel(chart)); frame.pack(); frame.setVisible(true); } ...

    jfreechart教程

    JFrame frame = new JFrame("JFreeChart 示例"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(chartPanel); frame.pack(); frame.setVisible(true); ``` 2. **图像文件**:...

    Jfreechart封装示例

    JFrame frame = new JFrame("JFreeChart示例"); frame.setContentPane(panel); frame.pack(); frame.setVisible(true); ``` 其中,`createDataset()`方法会根据实际需求填充数据。 8. **学习资源** ...

    jfreechart1.0.6_pdf

    此外,JFreeChart生成的图表可以直接在Web应用程序中显示,只需将图表对象嵌入到Servlet或JSP页面中即可。 #### 结论 JFreeChart作为一款成熟的Java图表库,为报表图开发提供了强大的支持。无论是基础的条形图、...

    jfreechart做的,读取Excel文件显示数据

    以上就是利用JFreeChart和Apache POI读取Excel文件并显示数据的基本流程。在实际应用中,可能还需要考虑错误处理、性能优化、数据筛选和过滤等细节。提供的压缩包文件"Project"可能包含了一个完整的示例代码,你可以...

    jfreechart

    JFrame frame = new JFrame("JFreeChart 示例"); frame.add(chartPanel); frame.pack(); frame.setVisible(true); File file = new File("output.png"); ChartUtilities.saveChartAsPNG(file, chart, 640, 480); ``...

    jfreechart所用的所有jar包.rar

    2. 创建`JFreeChart`对象后,可以使用`ChartUtilities`类将其保存为图像文件,或者在`JFrame`上显示。 3. 调整图表的样式,如更改颜色、添加图例、设置轴的范围等,可以使用`JFreeChart`对象的相应方法。 配合CSDN...

    jfreechart图表的完整工程例子(含中文乱码处理和百分比)

    本工程例子展示了如何利用JFreeChart创建包含中文内容的图表,并解决中文乱码问题以及饼图中显示百分比的问题。 ### 一、中文乱码处理 在Java程序中,处理中文字符时常常会遇到乱码问题。这通常是由于字符编码设置...

    JFreeChart 帮助文档 api 实例说明

    通过这些基本操作,开发者可以利用JFreeChart API创建复杂的图表应用,展示数据并进行数据分析。记住,实践是最好的学习方式,尝试编写代码并调整参数,以实现你需要的特定图表效果。同时,JFreeChart的官方文档和...

    jfreechart-jar包和使用方法

    JFrame frame = new JFrame("JFreeChart Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(chartPanel); frame.pack(); frame.setVisible(true); ``` JFreeChart还支持自定义图表的...

    JfreeChartDemo 仪表盘

    - 将图表添加到 `JFrame` 并显示。 4. **自定义仪表盘** JFreeChart 允许开发者通过调整各种参数来自定义仪表盘的外观和行为。例如,可以改变指针形状、添加标签、设置背景图案、调整刻度间隔等。此外,还可以...

    JFreeChart入门小例子.rar

    5. **绘制和展示**:创建好图表后,可以将其绘制到`BufferedImage`上,然后显示在GUI组件如`JFrame`中,或者保存为图片文件。`ChartUtilities`类提供了方便的方法,如`ChartUtilities.writeChartAsPNG()`,用于将...

    JFreeChart_GUI_Demo

    通过`JFreeChart_GUI_Demo`,开发者可以学习如何有效地利用`JFreeChart`库创建交互式的图表应用,结合Java GUI技术,为用户提供直观的数据展示界面。这些示例代码涵盖了从数据准备、图表创建到界面集成的全过程,...

    JFreeChart画折线实例

    在这个"JFreeChart画折线实例"中,我们将深入探讨如何利用JFreeChart库来创建折线图,并将其保存为本地文件。下面将详细讲解相关知识点。 首先,JFreeChart库的引入是通过在项目中添加其对应的依赖或jar包。如果你...

    jfreechart 1.0.8 演示+例子源码

    4. **输出方式**:JFreeChart不仅可以在Swing组件中直接展示图表,还可以导出为各种格式,如PNG、JPEG、PDF、SVG等,方便在报告或网页中集成。 5. **交互性**:JFreeChart支持用户交互,例如点击图表元素获取详细...

    JfreeChart的Jar包

    在Java应用程序、Web应用或Swing组件中,开发者常利用JFreeChart来可视化数据,帮助用户更好地理解和分析数据。JFreeChart以其丰富的定制选项和灵活性著称,可以创建出满足各种需求的精美图表。 在描述中提到的...

Global site tag (gtag.js) - Google Analytics