Как вывести общее количество страниц в нижнем колонтитуле JTextPane?

Я долго искал этот ответ и ничего не нашел.

Мне нужно распечатать содержимое JTextPane с нижним колонтитулом, который гласит "Страница из страниц". Сделать эту простую функцию в Java, похоже, невозможно.

Я могу установить нижний колонтитул для печати номеров страниц, когда я получаю Printable, например


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

Но, похоже, нет способа узнать общее количество страниц, которые будут напечатаны, пока не будет отправлено диалоговое окно принтера. Я предполагаю, что это потому, что диалоговое окно используется для форматирования страниц перед их отправкой на принтер. Диалоговое окно принтера всегда говорит, что есть только 1 (одна) страница.

Итак, я начал писать процедуру, которая будет проходить через документ 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)

Конечно, кто-то нашел простой способ сделать эту базовую функцию.

Заранее спасибо всем, кто может помочь.

13
задан mKorbel 10 February 2012 в 11:41
поделиться