2012-02-09 14 views
12

Przeszukałem wysoką i niską dla tej odpowiedzi i znalazłem puste.W jaki sposób można wydrukować całkowitą liczbę stron w stopce JTextPane?

Mam wymaganie, aby wydrukować zawartość JTextPane ze stopką, która mówi „strona <n> wśród <m> stron”. Wydaje się niemożliwe wykonanie tej prostej funkcji w Javie.

Mogę ustawić stopkę, aby wydrukować numery stron, gdy otrzymam wydruk, np.

 

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

Wygląda na to, że nie ma możliwości znalezienia całkowitej liczby stron, które będą drukowane, aż do momentu wyświetlenia okna dialogowego drukarki. Zakładam, że to dlatego, że to okno dialogowe służy do formatowania stron przed ich wysłaniem do drukarki. Okno dialogowe drukarki zawsze mówi, że jest tylko 1 (jedna) strona.

Tak więc zacząłem pisać procedurę, która przejdzie przez dokument JTextPane i policzy strony, pobierając widoczny obszar z PageFormat w metodzie print() , a następnie używając wysokości każdej linii (fontsize) do policz linie na każdej stronie, a następnie policz liczbę stron.eg

 

     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 ... 
     } 

Jednak PageFormat nie jest dostępna aż system oddzwania do metody print(), a do czasu robi metody print(), wydaje się niemożliwe, aby zmodyfikować stopkę ponieważ nagłówek i stopka są zarówno zdefiniowane jako „ostateczny” w wywołaniu metody:

 


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

pewnością ktoś znalazł prosty sposób w tym celu funkcję podstawową.

Z góry dziękuję wszystkim, którzy mogą pomóc.

+0

+1, dobre pytanie :-) – kleopatra

+0

MessageFormat nie jest ostateczny - czy próbowałeś MessageFormat.applyPattern zmienić komunikaty po ich wstępnym określeniu, ale tuż przed drukowaniem? Ponadto obliczenia strony są wykonywane w sun.swing.text.TextComponentPrintable.java. Są bardzo skomplikowane, ale być może mógłbyś je uruchomić dwa razy, raz podklasy lub przekierowania, by ominąć faktyczne drukowanie, ale uzyskaj całkowitą stronę i po raz drugi wydrukuj. Kilka pomysłów ... – Boann

+0

Jeszcze nie próbowałem żadnego z nich. Dziękuję za porady.Nie wiem, jak uzyskać nagłówek i stopkę do modyfikacji w metodzie print(). Jeśli uda mi się w jakiś sposób obliczyć liczbę stron, zanim się tam dostanę, utrzyma się prostą metodę print(). – Banjo

Odpowiedz

2
+0

+1 Jeszcze jeden artykuł do sprawdzenia http://java-sl.com/JEditorPanePrinter.html Łatwo jest zmodyfikować drukarkę stronowaną, aby dodać własną stopkę. – StanislavL

1

Wydaje się, że nie ma "bezpośredniego" sposobu, aby to osiągnąć. tutorial on JTextComponent mówi co następuje:

Ponieważ łączna liczba stron w produkcji nie jest znany przed czasie drukowania, nie ma sposobu, aby określić format numeracji jak „Page 1 of 5”.

Powiązane problemy