【问题标题】:Passing Locale details via Jasper-Reports to JFreechart通过 Jasper-Reports 将语言环境详细信息传递给 JFreechart
【发布时间】:2009-10-19 11:36:35
【问题描述】:

我正在将国际化添加到 Tapestry 网络应用程序中,该应用程序使用 Jasper Reports 生成普通表格报告以及通过 JFreeChart 生成图表和图形。

使用 Jasper REPORT_LOCALE 参数,我可以为 Jasper 报告设置区域设置,这对于表格报告非常有效,但不适用于 JFreeChart 报告。

轴刻度标签以默认语言环境显示,因此,如果我正在执行时间序列,我会得到以错误语言显示的月份名称。我想出解决此问题的唯一方法是更改​​我不满意的 JVM 默认语言环境。

有谁知道是否有某种方法可以将 JFreeChart 配置为使用特定的区域设置,以便在 Jasper 调用它时使用该区域设置?

【问题讨论】:

  • 我记得大多数 JFreeChart 方法都有一个语言环境参数。贾斯珀不会传下去吗?
  • 没有。我查看了源代码,Jasper 仔细地将包含区域设置的参数映射传播到报告代码但不传播到图表代码。

标签: java jasper-reports jfreechart


【解决方案1】:

我刚刚遇到了这个问题,并且能够通过创建一个图表定制器类来解决它。

在我的 .jrxml 中:

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

我的 Customizer 类如下所示:

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 检查。但你明白了。

查尔斯

【讨论】:

  • 谢谢,下次我在处理图表代码时会试试这个,并发布更新的进展情况
  • 我刚刚意识到我没有完全回答你的问题——我的问题是没有根据语言环境使用正确的小数和千位分隔符格式化数字,而你希望月份名称是本地化。但我认为你可以应用相同的概念——你可能有一个 DateAxis 而不是 NumberAxis,你应该能够调用 DateAxis.setDateFormatOverride()。我的定制器绝对适用于我正在做的事情;我在此评论中的建议未经测试,但应该有效。
猜你喜欢
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
相关资源
最近更新 更多