2012-02-09 24 views
12

मैंने इस उत्तर के लिए उच्च और निम्न खोजा है और खाली हो गए हैं।एक JTextPane फ़ूटर में पृष्ठों की कुल संख्या कैसे प्रिंट करता है?

मैं एक आवश्यकता एक पाद लेख है कि कहते हैं, "< मीटर > पृष्ठों की <n> पृष्ठ" के साथ एक JTextPane की सामग्री को मुद्रित करने के लिए की है। जावा में यह सरल कार्य करना असंभव प्रतीत होता है।

जब मैं प्रिंट करने योग्य प्राप्त करता हूं, तो मैं पृष्ठ संख्या मुद्रित करने के लिए पाद लेख सेट कर सकता हूं, उदा।

 

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

लेकिन वहाँ पृष्ठों उसके बाद प्रिंटर संवाद बॉक्स भेजा जाता है जब तक प्रिंट किया जाएगा की कुल संख्या को खोजने के लिए कोई रास्ता नहीं प्रतीत होता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि प्रिंटर पर भेजे जाने से पहले पृष्ठों को प्रारूपित करने के लिए उस संवाद का उपयोग किया जाता है। प्रिंटर संवाद बॉक्स हमेशा कहता है कि केवल 1 (एक) पृष्ठ है।

तो, मैंने एक दिनचर्या लिखना शुरू किया जो JTextPane दस्तावेज़ के माध्यम से जाएगा और प्रिंट() विधि में पेजफॉर्मेट से देखने योग्य क्षेत्र प्राप्त करके पृष्ठों को गिनें और फिर प्रत्येक पंक्ति (फोंटनाइज़) की ऊंचाई का उपयोग करके प्रत्येक पृष्ठ में लाइनों की गिनती करें, और बाद में पृष्ठों की संख्या गिनें .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 ... 
     } 

हालांकि, PageFormat जब तक सिस्टम विधि प्रिंट() में वापस बुलाता है, और जब तक यह विधि प्रिंट() करने के लिए हो जाता है उपलब्ध नहीं है, यह बाद से पाद लेख को संशोधित करने के लिए असंभव प्रतीत होता है शीर्ष लेख और पाद दोनों के रूप में "अंतिम" विधि कॉल में परिभाषित कर रहे हैं:

 


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

निश्चित रूप से किसी को इस बुनियादी कार्य करने के लिए एक आसान तरीका मिल गया है।

किसी भी मदद के लिए अग्रिम धन्यवाद।

+0

+1, अच्छा प्रश्न :-) – kleopatra

+0

संदेशफॉर्मैट अंतिम नहीं है - क्या आपने संदेशों को प्रारंभ करने के बाद संदेशों को बदलने के लिए संदेशफॉर्मैट.प्लीप्टर पैटर्न की कोशिश की है, लेकिन प्रिंटिंग से पहले ही? साथ ही, पृष्ठ गणना sun.swing.text.TextComponentPrintable.java में की जाती है। वे बहुत जटिल हैं, लेकिन हो सकता है कि आप वास्तविक प्रिंटिंग को बाईपास करने के लिए उप-वर्गीकृत या पुनर्निर्देशित करने के बाद उन्हें दो बार चला सकें, लेकिन पृष्ठ को कुल और प्रिंट करने के लिए दूसरी बार प्राप्त करें। बस कुछ विचार ... – Boann

+0

मैंने अभी तक उनमें से किसी भी कोशिश नहीं की है। इन सुझावों के लिए आपका धन्यवाद।मुझे यकीन नहीं है कि प्रिंट() विधि में संशोधन के लिए हेडर और पाद लेख कैसे प्राप्त करें। अगर मैं वहां पहुंचने से पहले पृष्ठों की संख्या की गणना कर सकता हूं, तो यह प्रिंट() विधि को सरल रखेगा। – Banjo

उत्तर

2

मुझे यकीन है कि अगर पृष्ठांकन और JEditorPane/JTextPane के मुद्रण के बारे में लेख के लिए नीचे दिए गए लिंक आप के लिए चाल करना होगा नहीं कर रहा हूँ, लेकिन निश्चित रूप से वे मेरे लिए एक बहुत कुछ किया:

  1. Pagination in the JEditorPane Component. Part I.
  2. Pagination in the JEditorPane Component. Part II (Printing).
  3. Pagination in the JEditorPane Component. Part III (Headers and footers).
  4. Pagination in the JEditorPane Component. Part IV (Page Breaks).
+0

+1 http://java-sl.com/JEditorPanePrinter.html जांचने के लिए एक और लेख अपने पाद लेख जोड़ने के लिए पेजिनेटेड प्रिंटर को संशोधित करना आसान है। – StanislavL

1

ऐसा लगता है कि इसे पूरा करने के लिए कोई "प्रत्यक्ष" तरीका नहीं है।

के बाद से उत्पादन में पृष्ठों की कुल संख्या पहले मुद्रण समय ज्ञात नहीं है, वहाँ की तरह एक नंबर प्रारूप निर्दिष्ट करने के लिए कोई रास्ता नहीं है "पेज 5 की 1": tutorial on JTextComponent निम्नलिखित कहते हैं।