2012-02-09 32 views
12

我已经搜索了这个答案的高和低,并已空白。如何打印JTextPane页脚中的页面总数?

我有一个要求,一个页脚,上面写着“页面的<ň米>页”打印的JTextPane的内容。 Java中做这个简单的函数似乎是不可能的。

我可以设置页脚打印页码,当我得到可打印,例如,

 

    String header = "whatever"; 
    String footer = " Page - {0}"; 
    printText(textPane.getPrintable(new MessageFormat(header), 
     new MessageFormat(footer))); 

但似乎没有办法找到的将被打印到打印机对话框被分派后总页数。我认为这是因为该对话框用于在将页面发送到打印机之前对其进行格式化。打印机对话框始终表示只有一个(一个)页面。

于是,我开始写一个程序,将经过JTextPane的文件和计数通过获取的print()方法 从PageFormat设置可视区域,然后用每行(字号)的高度的页面计算每个页面中的行数,然后计算页面数量

 

     int maxh = (int) pf.getImageableHeight(); 
     Element section = doc.getDefaultRootElement(); 
     for (int i=0; i<paraCount; i++) 
     { 
     Element e = section.getElement(i); 
     // Get the attributeSet for this paragraph (Element) 
     // The attributeSet contains the Styles, which contain 
     // the fonts etc. 
     AttributeSet attrs = e.getAttributes(); 
     int fontsize = StyleConstants.getFontSize(attrs); 

     // .... add up the lines and count filled pages ... 
     } 

然而,直到系统回调到print()方法,并通过一次获取到的print()方法的PageFormat不可用,这似乎是不可能修改页脚自页眉和页脚都定义为方法调用“最终”:

 


     public Printable getPrintable(final MessageFormat headerFormat, 
             final MessageFormat footerFormat) 

当然有人已经找到了一种简单的方法来做到这一点基本功能。

在此先感谢任何帮助的人。

+0

+1,很好的问题:-) – kleopatra 2012-02-10 10:28:14

+0

MessageFormat不是最终的 - 你有没有尝试MessageFormat.applyPattern改变消息后初步指定它们,但在打印之前?此外,页面计算在sun.swing.text.TextComponentPrintable.java中完成。它们非常复杂,但是也许你可以运行它们两次,一次被分类或重定向以绕过实际打印,但获得页面总数和第二次打印。只是一些想法... – Boann 2012-02-10 13:02:57

+0

我还没有尝试过任何这些。感谢您的小费。我不知道如何获取页眉和页脚来修改print()方法。如果我能以某种方式计算页面数量,那么它将保持print()方法的简单。 – Banjo 2012-02-10 18:47:55

回答

2
+0

+1另一篇文章来检查http://java-sl.com/JEditorPanePrinter.html很容易修改分页打印机添加自己的页脚。 – StanislavL 2012-02-18 16:31:03

1

似乎没有“直接”的方法来完成这一点。该tutorial on JTextComponent说以下内容:

由于输出的总页数 打印时间之前是不知道,也没有办法来指定像 一个编号格式“第5 1”。