Strange display of a table of radio buttons

痞子三分冷 提交于 2019-12-25 08:59:41

问题


I am creating a form, in which there is a table of buttons. The following shows the idea:

             Good         OK         Bad

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

Each row is a button group.

My program is able to work for a small table like the above. However, when rows or columns are more than one page to hold, the display is weird. This is my program:

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

Here are the screenshots when table.setKeepTogether(false). The display is a little different but still strange if the value is true.

Page 1

Page 2

Update

By following Samuel's approach, I am able to see radio buttons displayed on the first page. However, the buttons on the first page got displayed on the second page. See the screenshots.

Update 2

I got it working by adding the following in MyCellField :

writer.addAnnotation(radiogroup);  

instead of

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

I cannot explain why. Thank Samuel and Bruno for their help!


回答1:


Looking at your code again, is there any reason why you add the annotations for the radiobuttons all in one go at the end?. Have you tried adding the annotation whenever you've added your row of cells? Something like this:

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)

}

EDIT:

As Bruno said, the examples for distributing a radio-group over multiple pages are 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.

EDIT 2, Electric Bogaloo:

Wipped up a quick example based on your code and the examples Bruno pointed out:

I basicly took your code frm the question above(with some stub-implementations for your custom data-classes), and used the MyCellField PdfCellEvent extension found in RadioGroupMultiPage2:

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


来源:https://stackoverflow.com/questions/39695541/strange-display-of-a-table-of-radio-buttons

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!