2012-09-24 2 views
5

Sto costruendo un elenco verticale di mesi con un elenco orizzontale di giorni in ciascun mese. Ad ogni giorno aggiungo un rettangolo grande e colorato; la dimensione e il colore dipendono da un valore di una query db.Come centrare allinea l'elemento del modello in PdfPCell

Sto usando PdfPTable, PdfPCell e cbCreateTemplate fornite in this answer

Tutto il resto funziona bene (le dimensioni del rettangolo, il colore del rettangolo), a parte la posizione del rettangolo: è sempre posizionato a 0,0 anche se io (penso) ho impostato il posizionamento V & H. Un estratto del codice è sotto; si prega di avvisare.

int Severity = args.getPLR().get(i).getItems().get(j).getItems().get(itemIndex).getSeverity(); 
Severity = Severity + 5; //plump up, so that max (10) should fill the cell 
PdfPCell cell = new PdfPCell(); 
cell.setPadding(0); 
template = cb.createTemplate(Severity, Severity); 
template.setLineWidth(0.5f); 
template.rectangle(0, 0, Severity, Severity); 
//we should switch the color 
//based on the Severity 
switch ((Severity-5)) { 
    case 0: 
     template.setColorFill(Color.GREEN); 
     break; 
    case 1: 
     template.setColorFill(Color.GREEN); 
     break; 
    case 2: 
     template.setColorFill(Color.YELLOW); 
     break; 
    case 3: 
     template.setColorFill(Color.YELLOW); 
     break; 
    case 4: 
     template.setColorFill(Color.YELLOW); 
     break; 
    case 5: 
     template.setColorFill(Color.ORANGE); 
     break; 
    case 6: 
     template.setColorFill(Color.ORANGE); 
     break; 
    case 7: 
     template.setColorFill(Color.ORANGE); 
     break; 
    case 8: 
     template.setColorFill(Color.RED); 
     break; 
    case 9: 
     template.setColorFill(Color.RED); 
     break; 
    case 10: 
     template.setColorFill(Color.RED); 
     break; 
} 
template.fill(); 
img = Image.getInstance(template);   
chunk = new Chunk(img, 0f, 0f); 
cell.addElement(chunk); 
cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); 
painTable.addCell(cell); 

Questa è una grafica di ciò che viene mostrato: should be aligned center/center

Dovrebbe essere Centre/Centro. Dove ho sbagliato?

Questa è la parte di codice aggiornato utilizzando la soluzione accettata:

img = Image.getInstance(template);   
chunk = new Chunk(img, 0f, 0f); 
Phrase severityChunk = new Phrase(chunk); 
PdfPCell cell = new PdfPCell(severityChunk); 
cell.setPadding(0); 
cell.setHorizontalAlignment(Element.ALIGN_CENTER); 
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); 
painTable.addCell(cell); 

risposta

10

Stai mescolando text mode e composite mode.

Le proprietà di allineamento impostate sul livello di PdfPCell funzionano solo in modalità testo. Non appena si passa alla modalità composita (lo si fa utilizzando il metodo addElement()), iText ignora l'allineamento definito per la cella a favore dell'algemento definito per il contenuto della cella.

In modalità testo tutto il contenuto ha lo stesso allineamento. In modalità composita, puoi avere diversi elementi con diversi allineamenti.

Sono disponibili diverse opzioni: è possibile inserire Chunk in un Paragraph e definire l'allineamento per il paragrafo anziché per la cella. È possibile creare la cella in modalità testo utilizzando uno Phrase contenente il blocco. Potrebbe anche essere possibile creare una cella con un Image senza l'utilizzo di un pezzo, ecc ...

questo è spiegato nella "iText in azione" libro che ho scritto.

+0

Grazie Bruno. Ho usato la frase in una soluzione cellulare e ho aggiunto il codice aggiornato sopra. – DaveSav