Jak wyeksportować jeden do jednego JTable w pdf [duplikat]

Możliwy duplikat:
Dlaczego nagłówek JTable nie pojawia się na obrazku?
Rysowanie wierszy i kolumn JTable na panelu

Pracuję nad aplikacją raportową, w której muszę wyeksportować tabelę JTable w formie raportu. Ale kiedy próbuję bezpośrednio malować JTable na PDF, nie pokazuje on pierwszego wiersza i granicy kolumny. W tym celu spróbowałem używając domyślnej siatki kolorów Lewy górny brzeg. Co daje mi ciemniejszą linię w pliku PDF. Jednak gdy próbujesz wypełnić dowolną komórkę kolorem i wyeksportować ją na wyjście PDF, wszystkie linie siatki są niewidoczne.

SimpleTableDemo.java:

package com.swing.table;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.LineBorder;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;
import com.swing.data.BorderCellRenderer;

public class SimpleTableDemo extends JPanel implements ActionListener  {
    private boolean DEBUG = false;
    private int spacing = 6;
    private Map columnSizes = new HashMap();
    String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years",
            "Vegetarian" };

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

    final JTable table = new JTable(data, columnNames);

    public SimpleTableDemo() {
        super(new GridLayout(0, 1));

        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        // table.setFillsViewportHeight(true);

        // Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);


        BorderCellRenderer cellRenderer = new BorderCellRenderer();  
        cellRenderer.setBorder(new LineBorder(Color.BLACK));

        table.setDefaultRenderer(Object.class, cellRenderer);
        table.repaint();


        // Add the scroll pane to this panel.
        add(scrollPane);

        JButton button = new JButton("Create Pdf");
        button.addActionListener(this);
        add(button);


    }

    public void actionPerformed(ActionEvent e)
    {
        print();
    }

     private void print() {
            Document document = new Document(PageSize.A4.rotate());
            try {
              PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/jTable.pdf"));

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

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

              cb.addTemplate(pdfTemplate, 20, 20);
              g2.dispose();
              cb.restoreState();
            } catch (Exception e) {
              System.err.println(e.getMessage());
            }
            document.close();
          }

    /**
     Create the GUI and show it. For thread safety, this method should be
     invoked from the event-dispatching thread.
     */
    private static void createAndShowGUI() {
        // Create and set up the window.
        JFrame frame = new JFrame("SimpleTableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create and set up the content pane.
        SimpleTableDemo newContentPane = new SimpleTableDemo();
        newContentPane.setOpaque(true); // content panes must be opaque
        frame.setContentPane(newContentPane);

        // Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

BorderCellRenderer.java:

package com.swing.data;

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.border.*;

/**
 * @version 1.0 03/06/99
 */
public class BorderCellRenderer extends JLabel
    implements TableCellRenderer {
  protected Border noFocusBorder; 
  protected Border columnBorder; 
  protected Font font;

  public Font getFont() {
    return font;
}

public void setFont(Font font) {
    this.font = font;
}

public BorderCellRenderer() {
    noFocusBorder = new EmptyBorder(1, 2, 1, 2);
    setOpaque(true);
  }

  public Component getTableCellRendererComponent(JTable table, Object value,
                 boolean isSelected, boolean hasFocus, int row, int column) {
      setText((value == null) ? "" : value.toString());
      Border b;
      b = BorderFactory.createCompoundBorder();
     // b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(0,0,1,0,table.getGridColor()));
     // b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(0,0,0,1,table.getGridColor()));
     /* if(row == 0 && column == 0)
      {
          setBackground(Color.CYAN);

      }
      else
      {
      setBackground(Color.WHITE);
      }
      */
      if(row==0 || column == 0)
      {
          if(row ==0 && column==0)
          {
              b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(0,1,0,0,table.getGridColor()));
              b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(1,0,0,0,table.getGridColor()));
          }
          if(row == 0)
          {
              b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(1,0,0,0,table.getGridColor()));
              setBackground(Color.CYAN);
          }
          if(column == 0)
          {
              b = BorderFactory.createCompoundBorder(b, BorderFactory.createMatteBorder(0,1,0,0,table.getGridColor()));
          }
      }
      else
      {
          b = table.getBorder();
          setBackground(Color.WHITE);
      }
      setBorder(b);



      return this;
  }

  public void setColumnBorder(Border border) {
    columnBorder = border;
  }

  public Border getColumnBorder() {
    return columnBorder;
  }
}

Spróbuj użyć powyższego kodu i pomóż mi uzyskać jeden do jednego pliku PDF z liniami siatki i wypełnionym kolorem komórki.

Aktualizacja 1: - Zmodyfikowałem kod metody actionPerformed () jak poniżej: -

public void actionPerformed(ActionEvent e)
    {
        int x = table.getWidth();
            int y = table.getHeight();
            BufferedImage bi = null;

    if(x>0 && y>0)
    {
     bi = new BufferedImage(x, y, BufferedImage.TYPE_INT_RGB);
    if(bi != null)
            {
                Graphics g = bi.createGraphics();
                table.paint(g);
                JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi)));
            }
    }


        print();
    }

Dziękuję za obejrzenie mojego kodu. Moim wymaganiem nie jest wyświetlanie nagłówków tabel. Nie chciałem drukować nagłówków zgodnie z oczekiwaniami. Dlatego brakuje mojej pierwszej granicy pierwszego rzędu i lewej pierwszej kolumny. Aby to poprawić, ręcznie dodałem domyślną granicę siatki do pierwszej kolumny i wiersza. To sprawia, że ​​górna granica wygląda na ciemnoszarą. Poza tym muszę również wypełnić komórki kolorem. Wygląda dobrze, gdy drukuję go na buforowanym obrazie, ale później w pliku PDF usuwa on moje linie siatki z poniższych zrzutów ekranu: -

JTable do wyjścia buforowanegoImage

JTable do wyjścia pdf

questionAnswers(0)

yourAnswerToTheQuestion