Подтвердить что ты не робот

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

Я искал высокий и низкий для этого ответа и придумал пустой.

У меня есть требование распечатать содержимое 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)

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

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

4b9b3361

Ответ 1

Я не уверен, что ссылки ниже на статьи о разбиении на страницы и печати JEditorPane/JTextPane сделают трюк для вас, но, безусловно, они многое сделали для меня:

Ответ 2

Кажется, нет "прямого" способа выполнить это. Учебное пособие на JTextComponent сообщает следующее:

Так как общее количество страниц на выходе неизвестно до времени печати, нет способа указать формат нумерации, например "Страница 1 из 5".