Я искал высокий и низкий для этого ответа и придумал пустой.
У меня есть требование распечатать содержимое JTextPane с нижним колонтитулом, в котором указано "Страницы <m> страницы". Кажется невозможным сделать эту простую функцию в Java.
Я могу установить нижний колонтитул для печати номеров страниц, когда я получу Printable, например
String header = "whatever"; String footer = " Page - {0}"; printText(textPane.getPrintable(new MessageFormat(header), new MessageFormat(footer)));
Но, как представляется, невозможно найти общее количество страниц, которые будут напечатаны, до тех пор, пока не будет отправлено диалоговое окно принтера. Я предполагаю, что это потому, что этот диалог используется для форматирования страниц до их отправки на принтер. В диалоговом окне принтера всегда указывается, что существует только одна (одна) страница.
Итак, я начал писать процедуру, которая будет проходить через документ JTextPane и подсчитывать страницы, получая видимую область из PageFormat в методе print() а затем используя высоту каждой строки (fontsize), чтобы подсчитывать строки на каждой странице и затем подсчитывать количество страниц. например.
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 ... }
Тем не менее, PageFormat недоступен, пока система не вернется к методу print(), и к моменту получения метода print() невозможно изменить нижний колонтитул, поскольку верхний и нижний колонтитулы оба определены как "final" в вызове метода:
public Printable getPrintable(final MessageFormat headerFormat, final MessageFormat footerFormat)
Конечно, кто-то нашел простой способ сделать эту основную функцию.
Заранее благодарим всех, кто может помочь.