Jfreechart 乱码
整个图标分成三部分chart title,chart 的plot还有chart的 legend三个部分需要对他们分别设置字体就对了。
先看解决方法( 把这几个全部设置了,都搞定了就可以了):
标题乱码 chart.getTitle().setFont(new Font("宋体", Font.BOLD,12));
其他
- CategoryAxis domainAxis = plot.getDomainAxis();
- // NumberAxis valueAxis=(NumberAxis) plot.getRangeAxis();
- //有人说这个是水平方向设置的 方法。
- ValueAxis numberaxis = plot.getRangeAxis();
- /*------设置X轴坐标上的文字-----------*/
- domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
- /*------设置X轴的标题文字------------*/
- domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
- /*------设置Y轴坐标上的文字-----------*/
- numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
- /*------设置Y轴的标题文字------------*/
- numberaxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));
- /*------这句代码解决了底部汉字乱码的问题-----------*/
- jfreechart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
对于曲线图;
用于下面两种方法得到的来设置设置水平的和垂直的方法是不一样的。
JFreeChart chart = ChartFactory.createTimeSeriesChart("", "时间", "价格", lineDataset, true, true, true);
XYPlot plot = (XYPlot) chart.getPlot();
垂直的:
ValueAxis valueaxis=plot.getDomainAxis();
valueaxis.setLabelFont(new Font("宋体",Font.BOLD,12));
valueaxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));
水平的:
NumberAxis valueAxis=(NumberAxis) plot.getRangeAxis();
valueAxis.setLabelFont(new Font("宋体",Font.BOLD,12));
JFreeChart jfreechart = ChartFactory.createLineChart("‘大豆’别按小时计算拆线图", "时间", "价格", categoryDataset,PlotOrientation.VERTICAL, true, false,false);
CategoryPlot plot = (CategoryPlot) jfreechart.getPlot();
CategoryAxis domainaxis=plot.getDomainAxis();
水平的:
domainaxis.setLabelFont(new Font("宋体",Font.BOLD,20));
domainaxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
垂直的:
NumberAxis valueAxis=(NumberAxis) plot.getRangeAxis();
valueAxis.setLabelFont(new Font("宋体",Font.BOLD,20));
上面的是针对柱状图的,下面的是 设置饼状图的。
标题:chart.setTitle(new TextTitle("我的标题",new Font("宋体",Font.BOLD,20)));
图例: LegendTitle legendtitle=chart.getLegend(0);
legendtitle.setItemFont(new Font("我的标题",Font.ITALIC,20));
饼上面的文字:
PiePlot plot=(PiePlot)chart.getPlot();
plot.setLabelFont(new Font("宋体",Font.BOLD,20));
原因:
jfreechart主要是用来动态产生各种数据图形的,可最初使用的时候大都会碰到图片中的中文乱码或是一个小方块的情况。
仔细研究主要有以下2种原因:
1:服务器缺少中文字体,这多发生在Hp等unix操作系统上,解决的方法就是下载可用字体库到系统中,
有人也提出在Windows上产生图片在传回到Unix主机上的方法。
2:软件版本问题,jfreechart-1.0.10有人说没有问题,但jfreechart-1.0.11到13都有问题,我用的最新的jfreechart-1.0.13不做设置是有问题的。
究其原因,是它代码的内部设置的字体有问题.
先来跟踪一下它的代码:
JFreeChart chart = ChartFactory.createBarChart(
"数据统计图",
"设备号",
"积累值",
dataset,
PlotOrientation.VERTICAL,
true, true, false
);
它的原型
public static JFreeChart createBarChart(String title,
String categoryAxisLabel,
String valueAxisLabel,
CategoryDataset dataset,
PlotOrientation orientation,
boolean legend,
boolean tooltips,
boolean urls) {
上面的原型又调用了
JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
plot, legend);
currentTheme.apply(chart);
看看缺省字体的定义:
public static final Font DEFAULT_TITLE_FONT
= new Font("SansSerif", Font.BOLD, 18);
看看当前主题currentTheme是什么
private static ChartTheme currentTheme = new StandardChartTheme("JFree");
看它的原型定义
public StandardChartTheme(String name) {
if (name == null) {
throw new IllegalArgumentException("Null 'name' argument.");
}
this.name = name;
this.extraLargeFont = new Font("Tahoma", Font.BOLD, 20);
this.largeFont = new Font("Tahoma", Font.BOLD, 14);
this.regularFont = new Font("Tahoma", Font.PLAIN, 12);
this.smallFont = new Font("Tahoma", Font.PLAIN, 10);
……
看到了吧,默认的标题字体是SansSerif,在很多中文系统中是没有这种字体的,这可能是用老外开发开源产品的弊端吧。
首先说标题的乱码吧:
public JFreeChart(String title, Font titleFont, Plot plot,
boolean createLegend) {
……
对标题设置的代码:
if (title != null) {
if (titleFont == null) {
titleFont = DEFAULT_TITLE_FONT;
}
this.title = new TextTitle(title, titleFont);
this.title.addChangeListener(this);
}
它使用了默认字体,因此要解决这个问题只要,对标题重新设置字体就可以了。
……
TextTitle textTitle = chart.getTitle();
textTitle.setFont(new Font("黑体", Font.PLAIN, 20));
图例和其它乱码一样处理,更换字体。
CategoryPlot plot = chart.getCategoryPlot(); //获得图表区域对象
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setVisible(true);
plot.setDomainAxis(domainAxis);
ValueAxis rAxis = plot.getRangeAxis();
/*------设置X轴坐标上的文字-----------*/
domainAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,15));
/*------设置X轴的标题文字------------*/
domainAxis.setLabelFont(new Font("宋体",Font.PLAIN,15));
/*------设置Y轴坐标上的文字-----------*/
rAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,15));
/*------设置Y轴的标题文字------------*/
rAxis.setLabelFont(new Font("黑体",Font.PLAIN,15));
这里需要注意的是,哪里出现了乱码就修改哪里的字体,将字体转换为系统有的就可以了。
另外有人提出将jfreechart源文件里面的涉及到SansSerif字体的地方都替换成中文字体在重新编译,来个一劳永逸,我没有试,不知可不可以,我主要采用了重新设置字体的方法。
Jfreechart 乱码的更多相关文章
- JfreeChart 乱码问题处理
在前面之间加上下面这段代码即可. //创建主题样式 StandardChartTheme standardChartTheme=new StandardChartTheme("CN" ...
- java web 学习十(HttpServletRequest对象1)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- JFreechart在linux下不显示及中文乱码问题
一.使用JFreeChart建的报表,在window下能正常显示,但是放到linux下就报错,而且有时候会把tomcat挂掉, 原因是jfreechart的在linux系统中需要访问java awt库 ...
- JFreechart 在linux下不显示及中文乱码问题
一.使用JFreeChart建的报表,在window下能正常显示,但是放到linux下就报错,而且有时候会把tomcat挂掉, 原因是jfreechart的在linux系统中需要访问java awt库 ...
- 解决JFreeChart中文乱码问题
以下是解决X轴,Y轴中文字符乱码的代码: JFreeChart chart = ChartFactory.createBarChart3D("管网损耗",// 图表标题 " ...
- jfreechart图表汉字乱码问题解决方案
系统工作迁移环境 linux centos 6.5 tomcat8 mysql5.6 系统部署上之后,所有的jfreechart图表上的汉字,全部乱码. 如图: 经分析: 1)数据库动态读出来的是正常 ...
- JFreeChart的简单应用及乱码解决
一.JFreeChart介绍: JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP ...
- jfreechart中文乱码问题解决方案(转)
参考网址:http://zhidao.baidu.com/link?url=y88rR1_aAHaFofonx9o_IaEu87MpkTQImsqDcy587eG55JkfQV6EzzzloIgXuQ ...
- 【Java EE 学习 74 下】【数据采集系统第六天】【使用Jfreechart的统计图实现】【将JFreechart整合到项目中】
之前说了JFreechart的基本使用方法,包括生成饼图.柱状统计图和折线统计图的方法.现在需要将其整合到数据采集系统中根据调查结果生成三种不同的统计图. 一.统计模型的分析和设计 实现统计图显示的流 ...
随机推荐
- java 14 -6 BigInteger和BigDecimal
BigInteger:可以让超过Integer范围内的数据进行运算 构造方法: BigInteger(String val) import java.math.BigInteger; public c ...
- 用bower命令创建项目
1,先安装bower,npm install -g bower 2,cd到项目文件夹下,安装项目所需要的依赖包,比如 npm install jquery;npm install bootstrap, ...
- 【转】【C#】C#重绘windows窗体标题栏和边框
摘要 windows桌面应用程序都有标准的标题栏和边框,大部分程序也默认使用这些样式,一些对视觉效果要求较高的程序,如QQ, MSN,迅雷等聊天工具的样式则与传统的windows程序大不相同,其中迅雷 ...
- Elasticsearch 相关名词理解
Cluster包含多个node,Indices不应该理解成动词索引,Indices可理解成关系数据库中的databases,Indices可包含多个Index,Index对应关系数据库中的databa ...
- C语言错误: HEAP CORRUPTION DETECTED
程序源代码: //写文件两种方式(文本文件和二进制文件) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<std ...
- C# == equals 本质理解
using System; using System.Diagnostics; using System.Text; using System.Collections; using System.Co ...
- 突然想起android与mfc差异
两者都可以算作是客户端程序,都是做上位机用的.而且都是被动执行. 相同点: 1.MFC中,它是由 project的名字 里面的某个成员函数来初始化,窗体,以及窗体里面的变量. 后面都是监听消息循环.数 ...
- chrome http Request Header 修改插件
chrome http Request Header 修改插件 2013-05-31 11:03:03| 分类: JavaScript | 标签:chrome extensions chang ...
- unitty导出工程嵌入iOS原生工程中出现黑屏,但是模型还是可以扫。
一般上出现这个问题,其实就是因为两个注意点没有搞清楚.我们分析一下,如果我们的模型或者视屏能够出来但是屏幕还是黑屏的.说明我们的unity的组件其实已经加载出来了.但是供我们交互的那个Layer类并没 ...
- 【开源】XPShadow, 用阴影让UWP更有层次感
UWP采用的是纯扁平化的设计,个人感觉极端了点,整个世界都是平的,导致App分不清层次,看不出重点.其实扁平化是趋势,android, ios都在搞,问题是android, ios都可以很轻松的实现阴 ...