`
Disney2002
  • 浏览: 53934 次
  • 性别: 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阅读器,然后用户爱怎么打印怎么打印。

相关推荐

    JTable使用 JTable使用

    JTable使用 JTable使用JTable使用JTable使用

    JTable

    JTable的显示效果

    JTable动态刷新数据

    JTable 动态刷新数据 JTable 动态刷新数据是指在 Java Swing 应用程序中,使用 JTable 组件展示数据,并实时更新数据的过程。这种技术在很多实际应用场景中非常有用,如股票交易平台、实时监控系统、电子表格等。 ...

    jTree和jTable 双向联动

    实现jTable和jTree的双向联动,点击jTree会选中jTable单元格,点击jTable会选中jTree节点。

    JTable 练习例子exa

    在Java Swing库中,`JTable`是一个非常重要的组件,用于在GUI应用程序中展示表格数据。它是`javax.swing.JTable`类的实例,提供了一个可交互的二维数据视图,允许用户浏览、编辑和操作表格中的数据。这个"JTable ...

    JTable的使用收藏

    JTable的使用收藏 1.JTable与TableModel 1.TableModel与JTable的关系 2.TableModel实践 3.使用JTable+TableModel展示java中的数据对象 2.JTable展示方式的美化 1.设置表格的宽度和高度 2.要显示表头 3.新加列,将...

    支持ResultSet的JTable

    - `ResultSetMetaData`:通过`ResultSet.getMetaData()`获取,提供了关于查询结果列的信息,如列名、数据类型等。 - `ResultSet.getString(int columnIndex)`:用于获取指定列的字符串值。 - `ResultSet.getInt(int ...

    java 中 Jtable的用法

    ### Java中的JTable用法详解 #### 一、概述 JTable是Swing框架中用于显示和编辑表格数据的关键组件之一。它不仅提供了强大的数据管理功能,还支持丰富的定制选项,使得开发者能够根据具体需求创建出高度个性化的...

    Java JTree+JTable应用

    本项目是关于如何在Java应用程序中结合使用这两种组件的一个示例,特别强调了如何将`JTree`的节点内容动态地显示到`JTable`中。 首先,我们来看`JTree`。`JTree`是用来展示树状数据结构的组件,如文件系统目录结构...

    JTable的初步编程

    在Java Swing库中,`JTable`是一个非常重要的组件,用于在GUI应用程序中展示数据集。它是`javax.swing.JTable`类的一个...同时,不要忘记查阅Java官方文档和在线教程,以便获取更多关于`JTable`的高级特性和最佳实践。

    Swing之JTable的详细介绍

    关于Excel表与JTable之间的转换,通常可以通过读取Excel文件(例如使用Apache POI库)并将数据加载到`TableModel`,或者将JTable的数据导出到Excel文件。这样,可以在Java应用程序中展示和编辑Excel数据,同时保持与...

    JAVA中JTable的使用方法

    当`JTable`出现问题时,可以使用`print()`方法打印表格内容,帮助调试。同时,确保`TableModel`的线程安全,避免在非事件调度线程中修改数据。 11. **示例代码** 下面是一个简单的例子,展示了如何使用`JTable`和...

    JTable自动换行

    在Java的Swing库中,`JTable`是用于创建二维数据展示的组件,它类似于电子表格。在处理`JTable`时,我们有时需要使其单元格内容支持自动换行,以便更好地显示长文本。标题“JTable自动换行”正是指向这个功能,即...

    swing Jtable使用checkbox

    swing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing ...

    jtable详解

    ### Swing之JTable详解 在Java的图形用户界面(GUI)开发中,Swing库提供了丰富的组件以构建桌面应用程序,其中`JTable`是用于展示和编辑表格数据的关键组件。以下是对`JTable`的深入解析,包括其构造、属性、事件...

    JTable的介绍.doc

    在Java Swing中,`JTable`是用于展示数据的组件,通常用于创建类似电子表格的用户界面。`JTable`是`javax.swing.JTable`类的实例,它是`JComponent`的子类,因此继承了`Component`和`Container`的特性。`JTable`能够...

    mvc+Jquery-jTable

    **MVC + jQuery jTable 知识点详解** `MVC`(Model-View-Controller)是一种广泛用于Web应用开发的设计模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。在ASP.NET MVC...

    JTable 操作单元格 行 列

    以上就是关于`JTable`操作单元格、行和列的基本介绍。实际开发中,你可以根据需求进一步扩展这些功能,例如自定义数据模型、编辑器和渲染器,以满足更复杂的业务场景。在学习和实践中,不断探索`JTable`的API,你会...

    JAVA JTREE JTABLE实例代码

    通过jtble和tree这两个文件名,我们可以推测压缩包内可能包含了一些关于JTree和JTable的具体实现示例代码。这些代码可能涵盖了更复杂的功能,比如自定义渲染器、拖放操作、数据绑定等,学习这些代码可以帮助开发者更...

    不错的jquery插件jtable

    **jQuery 插件 jtable 知识详解** `jtable` 是一个强大的 jQuery 插件,它为 web 开发者提供了构建数据驱动的表格的简便方法。jtable 的设计目标是简化数据展示、编辑和管理的过程,使得在 ASP.NET MVC 框架下开发...

Global site tag (gtag.js) - Google Analytics