如何在pdf中导出一对一的JTable[重复]

2024-04-28

可能的重复:
为什么 JTable 标题没有出现在图像中? https://stackoverflow.com/questions/7369814/why-does-the-jtable-header-not-appear-in-the-image
在面板上绘制 JTable 行和列 https://stackoverflow.com/questions/12662373/drawing-jtable-rows-and-columns-on-a-panel

我正在开发一个报告应用程序,其中我必须以报告的形式导出 JTable。但是当我尝试直接在 PDF 上绘制 JTable 时,它​​不显示第一行和第一列边框。为此,我尝试使用默认颜色网格左上边框。这在 PDF 中给了我一条较黑的线。然而,当尝试用颜色填充任何特定单元格并将其导出到 PDF 输出时,所有网格线都是不可见的。

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

请尝试使用上面的代码并帮助我获得带有网格线和填充单元格颜色的一对一 PDF 输出。

更新 1:- 我修改了 actionPerformed() 方法的代码如下:-

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

感谢您查看我的代码。我的要求是不显示表格标题。我不想按预期打印标题。这就是为什么我的第一行顶部边框和左侧第一列丢失的原因。为了纠正这个问题,我手动向第一列和第一行添加了默认网格边框。这使得顶部边框看起来是深灰色的。除此之外,我还必须用颜色填充单元格。当我将其打印到缓冲图像时,它看起来不错,但后来在 pdf 中,它从下面的屏幕截图中删除了我的网格线:-

JTable to bufferedImage output BufferedImage JTable print output:-

JTable to pdf output jTable pdf output


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在pdf中导出一对一的JTable[重复] 的相关文章

随机推荐

  • 如何使用 RGB 元组列表在 PIL 中创建图像?

    假设我有一个像素列表 表示为具有 3 个 RGB 值的元组 列表如下list im getdata 像这样 0 0 0 255 255 255 38 29 58 如何使用这种格式的 RGB 值 每个元组对应一个像素 创建新图像 感谢您的帮助
  • 可以从curl访问docker服务,但不能从postman/chrome访问docker服务

    我正在做 docker 入门指南 https docs docker com get started part3 recap and cheat sheet optional https docs docker com get starte
  • Webpack 和外部库

    我正在尝试 webpack http webpack github io http webpack github io 看起来真的很不错 但我有点被困在这里了 假设我正在为库 f ex jQuery 使用 CDN 然后在我的代码中 我想要r
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 挂载 vue 组件 - Vue 3

    我想在 Vue 3 中这样做 new ComponentName propsData title hello world mount 但我收到这个错误 VueComponents component name WEBPACK IMPORTE
  • Azure 表存储和缓存

    是否值得使用 Azure 缓存预览版从 Azure 表存储缓存数据 或者在大型应用程序中表存储是否足够快 Thanks 简短的答案是这取决于 在我当前正在开发的应用程序中 我们使用缓存来处理一些信息来处理从表存储检索数据的延迟并适应每秒所需
  • 为数据提供有效类型是否会产生副作用?

    假设我有一大块动态分配的数据 void allocate size t n void foo malloc n return foo 我希望使用指向的数据foo作为一种特殊类型 type t 但我想稍后再这样做 而不是在分配期间这样做 为了
  • Android Studio:通过命令行安装Release App

    我想从命令行导出 apk 文件 release apk 当我运行这个命令时 gradlew installRelease 我发现了这个 在根项目 中找不到 Android Studio 任务 安装版本 一些候选者是 卸载版本 我该如何解决
  • 如何在 Windows 8 上注册自定义 Win+V 热键?

    可以在 Windows 8 之前的 Windows 版本上注册 Win V 热键 使用此组合的示例应用程序是PureText http www stevemiller net puretext 在 Windows 8 Release Pre
  • IFrame Resizer 未调整大小

    我正在这个页面上工作 http factor1hosting com dnaz wordpress certifications http factor1hosting com dnaz wordpress certifications 我
  • Android 上可靠的重复后台任务

    我正在尝试运行一个后台任务 该任务每分钟左右运行一次 Android 应用程序 但我正在努力确保该任务实际上每分钟运行一次 我尝试了从使用 SystemClock sleep 到 AlarmManager 重复闹钟和固定闹钟 的各种方法 但
  • 尝试返回 IQueryable 时发生转换错误

    我有一个查询应该返回IQueryable
  • Typescript 中的顶级等待和导入

    我正在研究 Typescript 并遇到问题 我想使用import和顶级await但目前 我一次只能使用一个 这是我的配置tsconfig json这允许我使用导入 target ESNext module ESNext 这个允许我使用顶级
  • 如何解析 XML diff 以仅显示差异

    我使用以下方法比较两个序列化对象的 xmlMS XmlDiffPatch 工具 http msdn microsoft com en us library aa302294 aspx C XML 示例 1
  • MS Access 2003 - 有没有一种方法可以以编程方式定义图表的数据?

    因此 我有一些 VBA 用于获取使用表单的图表向导构建的图表 并自动将其插入到 PowerPoint 演示文稿幻灯片中 我将这些图表表单用作较大表单中的子表单 该表单具有用户可以选择的参数来确定图表上的内容 这个想法是 用户可以确定参数 根
  • FluentNHibernate:AsSet()的作用是什么?

    在 Fluent Nhibernate 中 对 HasMany 或 HasManyToMany 关系指定 AsSet 有何影响 假设映射属性的类型是 Iesi Set 以下之间有什么区别 HasMany x gt x MySetProper
  • 按某些字段排序的迭代学说集合

    我需要这样的东西 products Products getTable gt find 274 foreach products gt Categories gt orderBy title as category echo categor
  • Angular.js ng-switch ---测试值是否为空或未定义

    在 Angular js 模板中 我需要测试值是否未定义或为空 我不知道如何执行此操作 因为ng switch when测试字符串中的表达式 我需要使用ng switch因为这是一个 if else 条件 有任何想法吗 div div h1
  • 如何搭建Windows Phone开发环境并使用F#开发应用程序?

    我已经下载了Windows Phone开发工具 但我不知道如何使用F 来开发应用程序 目前是C 将 F 和 Windows Phone 模板安装到 Visual Studio 中可以让生活变得更轻松 如果您打开 Visual Studio
  • 如何在pdf中导出一对一的JTable[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 JTable 标题没有出现在图像中 https stackoverflow com questions 7369814 why does the jtable header not appea