如何阅读图表定制器中Jasperreports传递的Locale?

时间:2017-06-30 05:51:41

标签: java jasper-reports locale jfreechart

(我的问题基于2016年4月的this HARDCODED示例,我正在寻找一个更新的,动态的答案,因为“bug”已经修复 - 没有定制器中可用的区域设置)

/* -Hardcoded example */
getNumberInstance(Locale.US)); //"Locale.US" is hardcoded rather than using the locale set in the report

目标:将jasper报告中设置的Locale传递给图表并使用图表Customizer进行阅读。

  • 如果报告区域设置不可用,我该如何正确阅读报告区域设置fixed (see here)

问题:在Customizer类(用Java编写)中,此命令不包含任何内容:JRParameter.REPORT_LOCALE。

public class AssetsChartMod implements JRChartCustomizer {

    public void customize(JFreeChart chart, JRChart jasperChart) {

            /* ----> */
            System.out.println( JRParameter.REPORT_LOCALE ); // PRINTS NOTHING

1 个答案:

答案 0 :(得分:1)

不幸的是,我们无法从 JRChart 对象获取报告的参数。这是从参数图中获取 Locale 的最简单方法。

但是我们可以执行这个技巧:

  1. jrxml 文件中为图表添加属性区域设置
  2. 带有图表声明的 jrxml 文件片段:

    <pie3DChart>
        <chart customizerClass="ru.alex.PieChartCustomizer" theme="aegean">
            <reportElement positionType="Float" x="0" y="0" width="100" height="100">
                <propertyExpression name="locale"><![CDATA[((java.util.Locale) ($P{REPORT_PARAMETERS_MAP}.get("REPORT_LOCALE"))).toString()]]></propertyExpression>
            </reportElement>
    

    该属性只能是 String 类型,这就是我在表达式中执行强制转换的原因。

    1. JRChartCustomizer 课程中,我借助于获取该属性 JRChart.getPropertiesMap()方法。
    2. 在我的情况下,包名称是 ru.alex

      public class PieChartCustomizer implements JRChartCustomizer {
      
          private static final String LOCALE_PROPERTY = "locale"; // the same name as at jrxml file
          private static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
      
          @Override
          public void customize(JFreeChart chart, JRChart jasperChart) {
              PiePlot pieChart = (PiePlot) chart.getPlot();
              JRPropertiesMap map = jasperChart.getPropertiesMap();
      
              Locale locale = DEFAULT_LOCALE; // this is default Locale if property was not set
              if (map != null && !map.isEmpty()) {
                  if (!isNullOrEmpty(map.getProperty(LOCALE_PROPERTY))) {
                      locale = Locale.forLanguageTag(map.getProperty(LOCALE_PROPERTY).replace("_", "-")); // here we have Locale passed via property 'locale'. Replacement applied: en_GB -> en-GB, for example
                  }
              }
      
              // some actions 
          }
      
          private static boolean isNullOrEmpty(String string) {
              return string == null || string.isEmpty();
          }
      }
      

      Voila,我们在定制器上获得了报告的区域设置。