Как в DynamicReports установить абсолютные координаты элементов отчета

В JasperReports вы всегда устанавливаете абсолютные координаты x и y для позиционирования элементов отчета. Например, в следующем примере отображается черный прямоугольник (верхний левый угол в точке (0,0)), который содержит белое текстовое поле «Hello World», начинающееся с x=70:

<rectangle>
    <reportElement x="0" y="0" width="557" height="20" backcolor="#000000" />
    <graphicElement fill="Solid">
        <pen lineWidth="0"/>
    </graphicElement>
</rectangle>

<textField>
    <reportElement x="70" y="2" width="100" height="14" style="pageLayoutFont"/>
    <textElement textAlignment="Left" verticalAlignment="Middle" />
    <textFieldExpression class="java.lang.String">
        <![CDATA["Hello World"]]>
    </textFieldExpression>
</textField>

Теперь я хочу добиться того же, используя DynamicReports. Это должно работать примерно так:

report().addDetail(
    cmp.rectangle()
       .setDimension(557, 20).setStyle(...),
    cmp.text("Hello World").setStyle(...)   
);

Однако я не могу найти способ определить позиционирование (в приведенном выше примере Java текст отображается под прямоугольником, а не внутри него.


person rainer198    schedule 02.05.2012    source источник


Ответы (1)


Для этого конкретного случая (прямоугольник как окружающий блок текстового поля) можно работать с horizontalLists. Горизонтальный список имеет прямоугольник в качестве фона (цвет) и имеет фиксированный размер. Для смещения текста к y=2 вы можете добавить тонкий элемент gap (такой же ширины) в качестве первого горизонтального списка, а затем добавить newRow. Затем ко второму пробелу with=70 добавляется текстовое поле Hello World . Кроме того, вы можете опустить пробел и добавить стиль заполнения в текстовое поле.

cmp.horizontalList()
    .setFixedDimension(557, 20)
    .setBackgroundComponent(...)
    .add(
        //1. a thin gap element
        cmp.gap(557,2)
    )
    .newRow()
    .add
    (
        //2. a gap of width 70
        cmp.gap(70,13),
        //3. the text field
        cmp.text("Hello World").setStyle(...)
    )

Хотя это работает в данном случае, это своего рода непрямой подход, который легко может запутать. Кроме того, мне интересно, есть ли решение для каждой задачи позиционирования, о которой вы только можете подумать.

person rainer198    schedule 03.05.2012