【问题标题】:Setting horizontalAlignment doesn't fully right align PageXofYBuilder设置 Horizo​​ntalAlignment 不能完全右对齐 PageXofYBuilder
【发布时间】:2019-05-09 22:56:27
【问题描述】:

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

Check this image to see the alignment issue

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

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

【问题讨论】:

  • 我不明白为什么人们不发表评论就拒绝投票。请留下评论,以便我可以改进

标签: java jasper-reports text-alignment dynamic-reports


【解决方案1】:

经过大量时间调试和检查动态报告的源代码后,我发现了问题所在。我将这篇文章发布给任何觉得它有帮助的人。

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

查看 ComponentTransform 类中 pageXofY 方法的以下代码,该方法负责在 jasper 设计中创建页码字段以了解更多详细信息:

 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);
    }

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 2011-07-26
    • 2012-10-13
    • 2016-10-28
    • 2013-06-04
    • 1970-01-01
    • 2010-10-19
    • 2019-01-26
    相关资源
    最近更新 更多