(我的问题基于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进行阅读。
问题:在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
答案 0 :(得分:1)
不幸的是,我们无法从 JRChart 对象获取报告的参数。这是从参数图中获取 Locale 的最简单方法。
但是我们可以执行这个技巧:
带有图表声明的 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 类型,这就是我在表达式中执行强制转换的原因。
在我的情况下,包名称是 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,我们在定制器上获得了报告的区域设置。