5

私のプロジェクトでは、すべてのカスタマイズ(境界線、色など)を使用してJTableコンポーネントをPDFで印刷する必要があります。この要件について、私は少し検索して、PDFでJTableを印刷するための1つのコードを見つけました。しかし、印刷した後、1行目と1列目のテーブルの境界線が欠落していることに加えて、特定の座標で印刷する方法が見つかりませんでした。以下の特定のコードをご覧ください:-

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

JTable全体を特定の座標で印刷することを提案してください。

ありがとう

4

2 に答える 2

6

AJTableは、画像(または印刷)に対して正しくレンダリングするのが難しいことで有名です。教祖の何人かがヒントを量る このスレッドを参照してください。

そのスレッドのスクリーンショットをよく見ると、デフォルトのMetalテーブルの左端に境界線がないことがわかります。

ただし、NimbusPLAFのテーブルはそうです。

于 2012-10-08T16:09:43.797 に答える
4

こんにちは私は以下のように追加することでコードを解決しました:-

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();
于 2012-10-10T11:35:07.943 に答える