Cómo exportar uno a uno JTable en el pdf [duplicado]

Posible duplicado:
¿Por qué el encabezado JTable no aparece en la imagen?
Dibujo de filas y columnas de JTable en un Panel

Estoy trabajando en una aplicación de informe en la que tengo que exportar un JTable en forma de informe. Pero cuando intento pintar directamente JTable en el PDF, no muestra el borde de la primera fila y la columna. Para esto lo intenté usando la cuadrícula de color predeterminada, los bordes superiores izquierda. Lo que me da una línea más oscura en el PDF. Sin embargo, cuando intente rellenar con color cualquier celda en particular y exportarla a PDF, todas las líneas de la cuadrícula son invisibles.

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

Por favor, intente con el código anterior y ayúdeme a obtener una salida PDF con líneas de cuadrícula y color de celda rellena.

Actualización 1: modifiqué el código para el método actionPerformed () como se muestra a continuación:

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

Gracias por echar un vistazo a mi código. Mi requisito no es mostrar los encabezados de tabla. No quería imprimir encabezados como se esperaba. Es por eso que falta el borde superior de mi primera fila y la primera columna a la izquierda. Para corregir esto, agregué manualmente un borde de cuadrícula predeterminado a la primera columna y fila. Esto hace que el borde superior se vea gris oscuro. Aparte de esto también tengo que rellenar las celdas con color. Se ve bien cuando lo imprimo en una imagen almacenada en búfer, pero luego en el pdf, se eliminan las líneas de la cuadrícula de las capturas de pantalla siguientes:

JTable a bufferedImage salida

JTable a salida pdf

Respuestas a la pregunta(0)

Su respuesta a la pregunta