table 个单选按钮的奇怪显示

Strange display of a table of radio buttons

我正在创建一个表单,其中有一个 table 个按钮。思路如下:

             Good         OK         Bad

Item1      [button]    [button]    [button]
Item2      [button]    [button]    [button]

每一行都是一个按钮组。

我的程序能够像上面那样为小型 table 工作。但是,当行或列超过一页时,显示会很奇怪。这是我的程序:

 PdfPTable table = new PdfPTable(colHeaders.size() + 1  );
 table.setWidthPercentage(100);
 PdfPCell cell;

 table.setSpacingBefore(10);
 table.setSpacingAfter(0);
 table.setKeepTogether(false); //tested "true" different display error

 //upper-left corner empty cell
 cell = new CustomPdfPCell();
 cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
 table.addCell(cell);

 //header row
 for (TableOfChoicesHeader c: colHeaders) {
    String text = c.getText();
    cell = new PdfPCell(new Phrase(text));
    cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
    table.addCell(cell);
 }

 List<PdfFormField> radioGroups= new ArrayList<PdfFormField>();

 //for each row
 for (TableOfChoicesHeader r: rowHeaders) {

    //row header
    String rowText = r.getText();
    cell = new PdfPCell(new Phrase(rowText));
    cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
    table.addCell(cell);

 //for the current row row
 String fieldName = "question" + q.getId() +"_" + r.getId().toString();

 PdfFormField radiogroup = PdfFormField.createRadioButton(writer, true);
 radiogroup.setFieldName(fieldName);

 radioGroups.add(radiogroup);

 for (TableOfChoicesHeader c: colHeaders) {     
     cell = new PdfPCell();
     cell.setHorizontalAlignment(Element.ALIGN_CENTER);
     cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
     cell.setPadding(5);
     cell.setCellEvent(new CheckboxCellEvent(fieldName, r.getId() + "_" + c.getId()));
     table.addCell(cell);                   
   }

 }
 document.add(table);

 for (PdfFormField g: radioGroups) {
    writer.addAnnotation(g);
 }

以下是table.setKeepTogether(false)时的截图。如果值为 true.

,则显示略有不同但仍然很奇怪

第1页

第2页

更新

按照 Samuel 的方法,我能够看到第一页上显示的单选按钮。但是,第一页上的按钮显示在第二页上。查看屏幕截图。

更新 2

我通过在 MyCellField 中添加以下内容使其工作:

writer.addAnnotation(radiogroup);  

而不是

PdfFormField field = radio.getRadioField();
writer.addAnnotation(field);

我无法解释为什么。感谢 Samuel 和 Bruno 的帮助!

再看看你的代码,你有什么理由在最后一次添加单选按钮的注释吗?。 您是否尝试过在添加单元格行时添加注释?像这样:

for (TableOfChoicesHeader r: rowHeaders) {

    //row header
    String rowText = r.getText();
    cell = new PdfPCell(new Phrase(rowText));
    cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
    table.addCell(cell);

    //for the current row row
    String fieldName = "question" + q.getId() +"_" + r.getId().toString();

    PdfFormField radiogroup = PdfFormField.createRadioButton(writer, true);
    radiogroup.setFieldName(fieldName);

    radioGroups.add(radiogroup);

    for (TableOfChoicesHeader c: colHeaders) {     
         cell = new PdfPCell();
         cell.setHorizontalAlignment(Element.ALIGN_CENTER);
         cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
         cell.setPadding(5);
         cell.setCellEvent(new CheckboxCellEvent(fieldName, r.getId() + "_" + c.getId()));
         table.addCell(cell);                   
    }
    writer.addAnnotation(radiogroup)

}

编辑:

正如 Bruno 所说,在多个页面上分发无线电组的示例是 RadioGroupMultiPage1 and RadioGroupMultiPage2. The examples for distributing a radio group across a table is found here: Distributing radio buttons of a radio field across multiple PdfCells

编辑 2,电动 Bogaloo:

根据您的代码和 Bruno 指出的示例删除了一个快速示例:

我基本上从上面的问题中获取了你的代码(对你的自定义数据进行了一些存根实现 - 类),并使用了 RadioGroupMultiPage2 中的 MyCellField PdfCellEvent 扩展:

   public MyCellField(PdfWriter writer, PdfFormField radiogroup, String value) {
        this.writer = writer;
        this.radiogroup = radiogroup;
        this.value = value;
    }

    public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {
        try {
            RadioCheckField radio = new RadioCheckField(writer, position, null, value);
            PdfFormField field = radio.getRadioField();
            writer.addAnnotation(field);
            radiogroup.addKid(field);
        } catch (IOException ex) {
            // do nothing
        } catch (DocumentException ex) {
            // do nothing
        }
    }