设置horizo​​ntalAlignment不能完全正确对齐PageXofYBuilder

时间:2018-12-08 11:19:31

标签: java jasper-reports dynamic-reports

我已经使用动态报告创建了报告,并添加了页码组件并将其水平对齐方式设置为正确。但是在打印的报告中,页码似乎没有完全正确对齐。

Check this image to see the alignment issue

注意:-页码表达式中没有右填充,页尾表达式中没有尾随空白。

使用的版本:- 动态报告-3.0.2 jasperreports-4.8.0

1 个答案:

答案 0 :(得分:1)

花费大量时间调试和检查动态报告的源代码后,我发现了问题。我会将其发布给任何认为有帮助的人。

当我们添加PageXofYBuilder时,动态报告实际要做的是为“ x”和“ y”创建两个文本字段。如果组件右对齐,则“ x”的文本字段将右对齐,而“ y”的文本字段将以固定宽度左对齐。根据所选字体,字体大小和水平填充,将“ y”的文本字段的宽度计算为6位数字所需的宽度。

在ComponentTransform类中检查以下pageXofY方法的代码,该代码负责在jasper design中创建页码字段,以获取更多详细信息:

 private DRDesignList pageXofY(DRIPageXofY pageXofY, DefaultStyleType    defaultStyleType) throws DRException {
        TemplateTransform templateTransform = accessor.getTemplateTransform();
        DRIReportStyle pageXofYStyle = pageXofY.getStyle();
        if (pageXofYStyle == null) {
            pageXofYStyle = accessor.getTemplateTransform().getTextStyle();
        }
        DRDesignStyle style = accessor.getStyleTransform().transformStyle(pageXofYStyle, true, defaultStyleType);
        Integer height = templateTransform.getPageXofYHeight(pageXofY, style);
        HorizontalAlignment horizontalAlignment = templateTransform.getPageXofYHorizontalAlignment(pageXofY, style);

        DRStyle newStylePageX = new DRStyle();
        newStylePageX.setParentStyle(pageXofYStyle);
        newStylePageX.getPadding().setRight(0);
        DRPen pen = new DRPen();
        pen.setLineWidth(0f);
        newStylePageX.getBorder().setRightPen(pen);
        DRStyle newStylePageY = new DRStyle();
        newStylePageY.setParentStyle(pageXofYStyle);
        newStylePageY.getPadding().setLeft(0);
        newStylePageY.getBorder().setLeftPen(pen);

        DRTextField<String> pageXField = new DRTextField<String>();
        pageXField.setAnchorNameExpression(pageXofY.getAnchorNameExpression());
        pageXField.setBookmarkLevel(pageXofY.getBookmarkLevel());
        pageXField.setHyperLink((DRHyperLink) pageXofY.getHyperLink());
        pageXField.setPrintWhenExpression(pageXofY.getPrintWhenExpression());
        pageXField.setStyle(newStylePageX);
        pageXField.setHeight(height);
        pageXField.setHeightType(pageXofY.getHeightType());
        pageXField.setHorizontalAlignment(HorizontalAlignment.RIGHT);
        pageXField.setValueExpression(new PageXofYNumberExpression(pageXofY.getFormatExpression(), 0));

        DRTextField<String> pageYField = new DRTextField<String>();
        pageYField.setAnchorNameExpression(pageXofY.getAnchorNameExpression());
        pageYField.setBookmarkLevel(pageXofY.getBookmarkLevel());
        pageYField.setHyperLink((DRHyperLink) pageXofY.getHyperLink());
        pageYField.setPrintWhenExpression(pageXofY.getPrintWhenExpression());
        pageYField.setStyle(newStylePageY);
        pageYField.setHeight(height);
        pageYField.setHeightType(pageXofY.getHeightType());
        pageYField.setHorizontalAlignment(HorizontalAlignment.LEFT);
        pageYField.setValueExpression(new PageXofYNumberExpression(pageXofY.getFormatExpression(), 1));
        DRIGroup pageYEvaluationGroup = accessor.getGroupTransform().getFirstResetPageNumberGroup();
        if (pageYEvaluationGroup == null) {
            pageYField.setEvaluationTime(Evaluation.REPORT);
        }
        else {
            pageYField.setEvaluationTime(Evaluation.GROUP);
            pageYField.setEvaluationGroup((DRGroup) pageYEvaluationGroup);
        }

        int pageXofYWidth = templateTransform.getPageXofYWidth(pageXofY, style);
        switch (horizontalAlignment) {
        case LEFT:
            int pageXWidth = StyleResolver.getFontWidth(style, 4);
            int pageYWidth = pageXofYWidth - pageXWidth;
            if (pageYWidth <= 0) {
                pageYWidth = 10;
            }
            pageXField.setWidth(pageXWidth);
            pageXField.setWidthType(ComponentDimensionType.FIXED);
            pageYField.setWidth(pageYWidth);
            pageYField.setWidthType(pageXofY.getWidthType());
            break;
        case RIGHT:
            pageYWidth = StyleResolver.getFontWidth(style, 6);
            pageXWidth = pageXofYWidth - pageYWidth;
            if (pageXWidth <= 0) {
                pageXWidth = 10;
            }
            pageXField.setWidth(pageXWidth);
            pageXField.setWidthType(pageXofY.getWidthType());
            pageYField.setWidth(pageYWidth);
            pageYField.setWidthType(ComponentDimensionType.FIXED);
            break;
        default:
            pageXField.setWidth(pageXofYWidth / 2);
            pageXField.setWidthType(pageXofY.getWidthType());
            pageYField.setWidth(pageXofYWidth / 2);
            pageYField.setWidthType(pageXofY.getWidthType());
            break;
        }

        DRList listPageXofY = new DRList();
        listPageXofY.addComponent(pageXField);
        listPageXofY.addComponent(pageYField);
        return list(listPageXofY, DefaultStyleType.TEXT, null, null);
    }

StyleResolver.getFontWidth()方法

protected static int getFontWidth(DRDesignStyle style, int columns) {
        double width = getFont(style).getStringBounds("m", context).getWidth();
        return (int) Math.ceil(width * columns) + getHorizontalPadding(style);
    }