`
Disney2002
  • 浏览: 54604 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于JTable的打印讨论

阅读更多
Java中用Table显示数据是再正常不过的了,有各种各样的Table,有些表头是固定的,有些表头是随查询的条件不同而结果不同,另一些表头部分固定,部分随查询的条件不同而结果不同。

这些是在界面上的显示,但是如果要打印出来呢?

下面就以打印为住,讨论几种实现方式:

1、JTable的print(),这是直接调用JTable的打印方法,打印是直接将界面的样式打印出去的,例如这个Demo:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.text.*;

public class TablePrint {
  public static void main(String args[]) {
    final Object rows[][] = {
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
      {"one",   "ichi - \u4E00"},
      {"two",   "ni - \u4E8C"},
      {"three", "san - \u4E09"},
      {"four",  "shi - \u56DB"},
      {"five",  "go - \u4E94"},
      {"six",   "roku - \u516D"},
      {"seven", "shichi - \u4E03"},
      {"eight", "hachi - \u516B"},
      {"nine",  "kyu - \u4E5D"},
      {"ten",   "ju - \u5341"},
    };
    final Object headers[] = {"English", "Japanese"};
    Runnable runner = new Runnable() {
      public void run() {
        JFrame frame = new JFrame("Table Printing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JTable table = new JTable(rows, headers);
        JScrollPane scrollPane = new JScrollPane(table);
        frame.add(scrollPane, BorderLayout.CENTER);
        JButton button = new JButton("Print");
        ActionListener printAction = new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            try {
              MessageFormat headerFormat = new MessageFormat("Page {0}");
              MessageFormat footerFormat = new MessageFormat("- {0} -");
              table.print(JTable.PrintMode.FIT_WIDTH, headerFormat, footerFormat);
            } catch (PrinterException pe) {
              System.err.println("Error printing: " + pe.getMessage());
            }
          }
        };
        button.addActionListener(printAction);
        frame.add(button, BorderLayout.SOUTH);
        frame.setSize(300, 150);
        frame.setVisible(true);
      }
    };
    EventQueue.invokeLater(runner);
  }
}

应该说比较简单,但是正式报表几乎没法用。

2.通过JasperReport工具来实现打印

目前大部分报表打印应该都是通过JasperReport来实现的,不知道的可以看看之前写的一个教程:JasperReport 个人使用的一些经验

问题是如果表头固定,那么模板还好设计,如果表头不固定呢?那就要自己来通过JasperDesign来绘制了,稍微有点麻烦了,这块自己的处理方式是表头固定的JasperReport,不固定的就直接Swing绘制,就是下面要讲的一种。

3. 通过 print(Graphics g, PageFormat pf, int pageIndex)方法手动绘制

这个方法的好处是基本上所有报表应该都不是问题,关键是绘制起来有些麻烦了,需要手动考虑分页问题,以及字体设置,绘制表头,绘制数据区域,绘制表尾等。

上面三个方法是目前我知道的,第一种几乎就没法在报表中使用,一般是第二种方法,第三种方法是实在用第二种不好实现时使用的。

不知道大伙项目中遇上复杂的报表打印是如何处理的呢?

分享到:
评论
3 楼 carlkkx 2009-11-13  
Disney2002 写道
carlkkx 写道
生成PDF,然后打开PDF阅读器,然后用户爱怎么打印怎么打印。

关键问题是有些时候,用户只要打印,即使我导出成Excel也不成,按钮下去,打印机出来,没有多余步骤!

一般用户都需要打印预览吧?这不就借用PDF阅读器作为打印预览,然后用PDF阅读器的打印命令打印,想必一般用户都能接受吧。
2 楼 Disney2002 2009-11-11  
carlkkx 写道
生成PDF,然后打开PDF阅读器,然后用户爱怎么打印怎么打印。

关键问题是有些时候,用户只要打印,即使我导出成Excel也不成,按钮下去,打印机出来,没有多余步骤!
1 楼 carlkkx 2009-11-10  
生成PDF,然后打开PDF阅读器,然后用户爱怎么打印怎么打印。

相关推荐

    java gui 程序设计

    书中第一部分主要介绍Java GUI程序设计的基础理论,这部分内容包括了AWT(Abstract Window Toolkit)组件类的详细讨论。AWT是Java中用于创建图形用户界面的一套基础类库,它提供了一系列界面元素,比如按钮、文本框...

    java实验五(1).doc

    首先,让我们详细讨论数据库部分: 1. **数据库创建与表结构**: - 使用SQL语句创建一个名为`webstore`的数据库。 - 在`webstore`数据库中创建一个名为`products`的表,包含以下字段: - `prod_id`:产品ID,...

    Rich Clients with SWING.pdf

    - **增强的GUI特性**:Java 6还增强了Swing的一些基本功能,例如改进了JTable的打印支持、简化了窗口添加组件的方式等。此外,通过引入XAWT,Java应用在Linux平台上的兼容性和性能也得到了显著提升。 #### Java桌面...

    Java_Swing,2ndEdition

    1. **Swing组件**:包括JButton、JLabel、JTextArea、JTable、JTree等基本和复杂的组件,它们的用法、属性设置和事件监听。 2. **布局管理器**:如FlowLayout、BorderLayout、GridLayout、CardLayout以及各种复合...

    用java语言编写的日历

    在本讨论中,我们将深入探讨如何使用Java来编写一个日历程序,以及涉及的相关知识点。 首先,我们需要理解Java中的日期和时间处理。Java 8引入了`java.time`包,它提供了比早期`java.util.Date`和`java.util....

    java项目学生成绩管理系统.doc

    下面将详细讨论这些知识点。 1. **数据库设计**: - **教师信息表**:包含教师ID(主键)、姓名(唯一不为空)、登录密码等字段,用于存储教师的基本信息和认证信息。 - **学籍信息表**:包含学号(主键)、姓名...

    SwingUI-JFC好书.pdf

    7. **高级特性**:除了基本的GUI构建功能外,Swing还支持许多高级特性,比如拖放操作(Drag and Drop)、剪贴板操作(Clipboard)、打印支持等。 #### 五、参考资源 - **官方文档**:[Swing官方文档]...

    JAVA6

    在本文中,我们将深入探讨Java 6的关键特性,并讨论其对开发者和应用程序的影响。 1. **编译器增强**: Java 6的编译器进行了优化,提供了更快的编译速度和更高的代码质量。其中,类型推断(Type Inference)引入...

Global site tag (gtag.js) - Google Analytics