2009-10-19 53 views
1

我将国际化添加到Tapestry Web应用程序中,该应用程序使用Jasper Reports生成正常的表格报告以及通过JFreeChart生成的图表和图表。通过Jasper-Reports向JFreechart传递语言环境详细信息

使用Jasper REPORT_LOCALE参数,我可以设置Jasper报告的语言环境,这对于表格报告来说非常合适,但它对JFreeChart报告不起作用。

轴标记标签出现在默认的语言环境中,所以如果我正在做一个时间序列,我会得到错误语言的月份名称。我想出了如何处理这个问题的唯一方法是更改​​我不喜欢的JVM默认语言环境。

有谁知道是否有一些方法来配置JFreeChart使用特定的语言环境,以便当Jasper调用它时,它使用该Locale?

+0

我记得大多数具有区域设置参数的JFreeChart方法。 Jasper不会传递它吗? – jitter 2009-10-19 12:01:52

+0

不可以。我已经查看了源代码,Jasper小心地将包含Locale的参数Map包含到报告代码中,但不传递给制图代码。 – 2009-10-19 20:02:35

回答

1

我刚刚遇到了这个问题,并且能够通过创建Chart Customizer类来解决它。

在我的.jrxml:然后

<chart evaluationTime="Report" customizerClass="foo.Customizer" renderType="image"> 

我的定制类看起来是这样的:

package foo; 

import java.text.NumberFormat; 
import java.util.Locale; 

import net.sf.jasperreports.engine.JRAbstractChartCustomizer; 
import net.sf.jasperreports.engine.JRChart; 
import net.sf.jasperreports.engine.JRParameter; 

import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.CategoryPlot; 

public class Customizer extends JRAbstractChartCustomizer { 

    public void customize(JFreeChart chart, JRChart jasperChart) { 
     CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
     NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
     rangeAxis.setNumberFormatOverride(
      NumberFormat.getInstance((Locale) 
      getParameterValue(JRParameter.REPORT_LOCALE))); 
    } 

} 

是啊,该代码使得很多的假设。但是我总是在运行报表之前明确设置区域设置,所以我知道这不是空的。而且我知道我的特定图表有一个CategoryPlot和一个NumberAxis,所以我不执行instanceof检查。但你明白了。

Charles

+0

谢谢,下次我在绘制代码并发布更新时会尝试这个问题 – 2010-02-05 09:42:51

+0

我刚刚意识到我没有完全回答你的问题 - 我的问题是数字不是根据区域设置使用正确的小数和千位分隔符进行格式化,而您希望将月名称进行本地化。但我认为你可以应用相同的概念 - 你可能有一个DateAxis而不是一个NumberAxis,你应该可以调用DateAxis.setDateFormatOverride()。我的定制工具肯定适合我正在做的事情;我在这个评论中提出的建议没有经过检验,但应该有效。 – 2010-02-17 19:26:53