2012-09-24 9 views
5

Buduję pionową listę miesięcy z poziomą listą dni w każdym miesiącu. Każdego dnia dodaję rozmiar i kolorowy prostokąt; rozmiar i kolor zależą od wartości z zapytania db.Jak wyśrodkować Wyrównaj element szablonu w PdfPCell

Używam PdfPTable, PdfPCell i cbCreateTemplate przewidzianego w this answer

wszystko inne działa dobrze (rozmiar prostokąta, kolor prostokąta), oprócz położenia prostokąta: zawsze jest umieszczona na 0,0 mimo, że ja (myślę) ustawiłem pozycjonowanie H na V &. Fragment kodu znajduje się poniżej; proszę doradź.

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

Jest to graficzny, co jest pokazane: should be aligned center/center

Należy Centrum/Centrum. Gdzie się pomyliłem?

Jest to zaktualizowana część kodu za pomocą przyjętego rozwiązania:

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

Odpowiedz

10

Ty mieszanie text mode i composite mode.

Właściwości linii trasowania ustawione na poziomie PdfPCell działają tylko w trybie tekstowym. Zaraz po przejściu do trybu złożonego (robisz to za pomocą metody addElement()), iText ignoruje wyrównanie zdefiniowane dla komórki na rzecz aligmentu zdefiniowanego dla zawartości komórki.

W trybie tekstowym cała zawartość ma takie samo wyrównanie. W trybie złożonym możesz mieć różne elementy z różnymi dopasowaniami.

Masz różne opcje: możesz umieścić Chunk w Paragraph i zdefiniować wyrównanie akapitu zamiast komórki. Komórkę można utworzyć w trybie tekstowym za pomocą Phrase zawierającej porcję. Możliwe jest nawet utworzenie komórki z numerem Image bez korzystania z porcji, itp ...

Wszystko to wyjaśniono w książce "iText w akcji", którą napisałem.

+0

Dzięki Bruno. Użyłem rozwiązania Fraza w komórce i dodałem zaktualizowany kod powyżej. – DaveSav

Powiązane problemy