2012-10-08 16 views
5

Projemde, JTable bileşenlerini bir pdf'ye tüm özelleştirmelerle (kenarlıklar, renkler vb.) Yazdırmak zorundayım. Bu gereksinim için biraz araştırma yaptım ve pdfs'de JTable'ı yazdırmak için bir kod buldum. Ancak baskıdan sonra, tablodaki 1. satır ve 1. sütun için sınırın eksik olduğunu ve belirli bir koordinatta yazdırmanın bir yolunu bulamadığımı fark ettim. Aşağıdaki belirli kod bakınız: -Tam bir JTable bileşenini pdf'de belirli bir koordinatta dışa aktarma

package com.jpmorgan.dqreport; 

import java.awt.BorderLayout; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.io.FileOutputStream; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTable; 

import com.lowagie.text.Document; 
import com.lowagie.text.PageSize; 
import com.lowagie.text.pdf.PdfContentByte; 
import com.lowagie.text.pdf.PdfWriter; 

public class JTable2Pdf extends JFrame { 
    private JTable table; 

    public JTable2Pdf() { 
    getContentPane().setLayout(new BorderLayout()); 
    createTable(); 
    } 
    private void createTable() { 
     Object[][] data = { 
       {"Kathy", "Smith", 
       "SnowboardingXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", new Integer(5), new Boolean(false)}, 
       {"John", "Doe", 
       "Rowing", new Integer(3), new Boolean(true)}, 
       {"Sue", "Black", 
       "Knitting", new Integer(2), new Boolean(false)}, 
       {"Jane", "White", 
       "Speed reading", new Integer(20), new Boolean(true)}, 
       {"Joe", "Brown", 
       "Pool", new Integer(10), new Boolean(false)} 
       }; 
     String[] columnNames = {"First Name", 
       "Last Name", 
       "Sport", 
       "# of Years", 
       "Vegetarian"}; 

    table = new JTable(data, columnNames); 

    JPanel tPanel = new JPanel(new BorderLayout()); 
    tPanel.add(table.getTableHeader(), BorderLayout.NORTH); 
    tPanel.add(table, BorderLayout.CENTER); 

    getContentPane().add(tPanel, BorderLayout.CENTER); 
    } 
    private void print() { 
    Document document = new Document(PageSize.A4.rotate()); 
    try { 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\jTable.pdf")); 

     document.open(); 
     PdfContentByte cb = writer.getDirectContent(); 

     cb.saveState(); 
     Graphics2D g2 = cb.createGraphics(500, 500); 

     Shape oldClip = g2.getClip(); 
     g2.clipRect(10, 0, 500, 500); 

     table.print(g2); 
     g2.setClip(oldClip); 

     g2.dispose(); 
     cb.restoreState(); 
    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
    } 
    document.close(); 
    } 
    public static void main(String[] args) { 
    JTable2Pdf frame = new JTable2Pdf(); 
    frame.pack(); 
    frame.setVisible(true); 
    frame.print(); 
    } 
} 

Belli bir bölüme koordinat de tüm JTable yazdırmak için Bir şekilde önerin.

Teşekkür

A JTable görüntüler için doğru render almak oldukça zordur

cevap

4

Merhaba ben gibi aşağıda ekleyerek kod çözüldü: -

cb.saveState(); 

PdfTemplate pdfTemplate = cb.createTemplate(table.getWidth(), table.getHeight()); 
Graphics2D g2 = pdfTemplate.createGraphics(table.getWidth(), table.getHeight()); 
/*g2.setColor(Color.BLACK); 
g2.drawRect(x-2, y-2, table.getWidth()+2, table.getHeight()+2);*/ 
table.print(g2); 
System.out.println("x="+x + "," + "y=" + y); 
cb.addTemplate(pdfTemplate, x, y); 
g2.dispose(); 
cb.restoreState(); 
6

(ya sanırım, basım). Bazı guruların, ipuçlarıyla tartıldığı this thread numaralı telefona bakın.

Bu iş parçacığının ekran görüntülerine yakından bakıldığında, varsayılan Metal tablonun en solda kenarlık olmadığı anlaşılmaktadır.

Nimbus PLAF masa olsa yapar.

+2

+1 Nimbus bakın ve hissedin – mKorbel