2014-10-23 5 views
7

मुझे पूरा यकीन नहीं है कि मैं g.drawString को समझता हूं।एक भौतिक रूप से प्रिंट करना - मूल समझ की आवश्यकता है

मेरे पास एक प्रोग्राम है जो प्रीप्रिंट किए गए फॉर्म को लिखता है। उपयोगकर्ता दावा करते हैं कि प्रिंटिंग अनियमित है ... यानी, फॉर्म पर पाठ पिछले प्रिंट की तुलना में अधिक/कम है। निजी तौर पर, मुझे लगता है कि वे फॉर्म को गलत तरीके से लोड कर रहे हैं, लेकिन चूंकि वे मुझे कोड लिखने के लिए भुगतान करते हैं, इसलिए मैं फॉर्म को माप रहा हूं और आयामों को पिक्सल में परिवर्तित कर रहा हूं और प्रिंटिंग से संबंधित हिस्से को फिर से लिख रहा हूं।

फ़ॉर्म को सही तरीके से मुद्रित करने के लिए, c.getCostAmount() को इसके नीचे एक पंक्ति दिखाई देने के लिए एक पिक्सेल ऊपर c.getAppraisersAmount() मुद्रित करना होगा। फिर भी, प्रत्येक सफल रेखा उस से 4 मिमी (या लगभग 15 पिक्सेल) है।

मेरी समस्या यह है कि मुझे ऊर्ध्वाधर दूरी समझ में नहीं आता है और क्यों तीसरी पंक्ति को पिछली पंक्ति के ऊपर एक पिक्सेल रखा जाना चाहिए जिसके लिए नीचे होना चाहिए।

किसी के पास त्वरित-एन-आसान स्पष्टीकरण या ट्यूटोरियल/स्पष्टीकरण का लिंक है?

बहुत धन्यवाद!

कोड (ज/टी एलेक्स, Java: Printing program output to a physical printer):

public int print(Graphics g, PageFormat pf, int page, Check c){ 
    final double MILLIMETER_IN_PIXELS = 3.779527559; 
    DecimalFormat df = new DecimalFormat("$#.00"); 

    if (page > 0) { 
     return NO_SUCH_PAGE; 
    } 

    Graphics2D g2d = (Graphics2D) g; 
    int x = (int) pf.getImageableX(); 
    int y = (int) pf.getImageableY(); 
    g2d.translate(x, y + .5); 

    Font font = new Font("Courier New", Font.PLAIN, 10); 
    g2d.setFont(font); 
    FontMetrics metrics = g.getFontMetrics(font); 
    g.drawString("CHECK #" + c.getCheckNumber(), ((int) MILLIMETER_IN_PIXELS* 55),((int) MILLIMETER_IN_PIXELS*15)); 

    int strWidth = SwingUtilities.computeStringWidth(metrics, df.format(c.getAppraisersAmount())); 
    g.drawString(df.format(c.getAppraisersAmount()), ((int) ((MILLIMETER_IN_PIXELS*62)-strWidth)), ((int) MILLIMETER_IN_PIXELS*23)); 

    Date d = c.getJavaDate(); 
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 
    g.drawString(sdf.format(d), ((int) MILLIMETER_IN_PIXELS*90), ((int) MILLIMETER_IN_PIXELS*24)); 

    strWidth = SwingUtilities.computeStringWidth(metrics, df.format(c.getCostAmount())); 
    g.drawString(df.format(c.getCostAmount()), ((int) ((MILLIMETER_IN_PIXELS*62)-strWidth)), ((int) (MILLIMETER_IN_PIXELS*22))); 

    strWidth = SwingUtilities.computeStringWidth(metrics, df.format(c.getRefundsAmount())); 
    g.drawString(df.format(c.getRefundsAmount()), ((int) ((MILLIMETER_IN_PIXELS*62)-strWidth)), ((int) (MILLIMETER_IN_PIXELS*26)));   

    strWidth = SwingUtilities.computeStringWidth(metrics, df.format(c.getOfficersAmount())); 
    g.drawString(df.format(c.getOfficersAmount()), ((int) ((MILLIMETER_IN_PIXELS*62)-strWidth)), ((int) (MILLIMETER_IN_PIXELS*30))); 

    Double totalLeft = c.getAppraisersAmount() + c.getCostAmount() + c.getRefundsAmount() + c.getOfficersAmount(); 
    strWidth = SwingUtilities.computeStringWidth(metrics, df.format(totalLeft)); 
    g.drawString(df.format(totalLeft), ((int) ((MILLIMETER_IN_PIXELS*62)-strWidth)), ((int) (MILLIMETER_IN_PIXELS*44))); 

    return PAGE_EXISTS; 
} 
+3

व्यक्तिगत रूप से, मुझे नहीं पता, लेकिन मुझे यह जानने में दिलचस्पी है कि जवाब क्या है! मुझसे स्टार और आप को जयकार! – DreadHeadedDeveloper

उत्तर

0

मुझे यकीन नहीं है कि आपने MILLIMETER_IN_PIXELS मान को कैसे निर्धारित किया है, यह मेरे लिए पूरी तरह से संदिग्ध दिखता है। ((int) MILLIMETER_IN_PIXELS*23), ((int) MILLIMETER_IN_PIXELS*24), और ((int) (MILLIMETER_IN_PIXELS*22)):

आप शब्दों का प्रयोग:

हालांकि, त्रुटि जो आप भ्रामक बस लापता ब्रेसिज़ का एक मामला है।

ध्यान दें कि प्रथम दो शब्द के बजाय पहले एक double गुणा प्रदर्शन और उसके बाद int लिए कास्टिंग के उत्पाद MILLIMETER_IN_PIXELS*… आप int को MILLIMETER_IN_PIXELS डाली पहले मूल्य 3 हो रही है जिसका अर्थ है चारों ओर ब्रेसिज़ की कमी है, और फिर गुणा,।

इसलिए गोल करने वाली त्रुटियां अलग-अलग हैं। परिणामी मान 69, 72, 83 हैं।

नोट, कि लापता ब्रेसिज़ की त्रुटि किसी अन्य स्थान पर दिखाई देती है, क्षैतिज स्थिति भी प्रभावित होती है।


एक परिशिष्ट के रूप में, आपके द्वारा वास्तविक डीपीआई प्राप्त होते हैं:

Point2D p = g2d.getDeviceConfiguration().getDefaultTransform() 
    .transform(new Point2D.Float(72,72),null); 
// normally, both are the same 
int horizontalDPI=(int)p.getX(), verticalDPI=(int)p.getY(); 

स्पष्टीकरण: डिफ़ॉल्ट परिवर्तन एक परिवर्तन जो एक इंच के लिए 72 उपयोगकर्ता के अंतरिक्ष पिक्सेल को बदलने के रूप में निर्दिष्ट किया जाता है, इसलिए जब परिवर्तन को 72 पर लागू करना, इसके परिणामस्वरूप एक इंच से मेल खाने वाले डिवाइस पिक्सल की संख्या होगी।

+0

तो यह CPEMDAS है? :) –

+0

वह मुद्दा था, तो। धन्यवाद, दोनों इसे हल करने और जावा की मेरी समझ में मेरी धारणा को मजबूत करने के लिए। –

+1

पेंटिचेस कास्ट की तुलना में अधिक प्राथमिकता है, लेकिन कास्ट गुणा से पहले आता है (एक्सपोनेंट यहां लागू नहीं होता है क्योंकि जावा में ऐसा कोई ऑपरेटर नहीं है)। वैसे, अगर संदेह में, आप किसी भी चीज के चारों ओर कोष्ठक डाल सकते हैं और फिर ग्रहण में CTRL + 1 दबाएं, तो पॉपअप मेनू से "अतिरिक्त कोष्ठक निकालें" चुनें, जो सभी अप्रचलित ब्रेसिज़ को हटा देगा लेकिन सभी आवश्यक बनाए रखेगा। – Holger

0

इम है कि या तो यह अच्छा नहीं अपने आप को, लेकिन एक किताब मैंने पढ़ा tekst के बारे में एक बहुत अच्छी explination था और यह कैसे जब बर्ताव में चित्रित। मैंने एक परिचित स्पष्टीकरण की खोज की और मुझे ओरेकल से एक मिला। यहां यह है: http://docs.oracle.com/javase/tutorial/2d/text/measuringtext.html यह उतना अच्छा नहीं है लेकिन यह कुछ है। टेकस्ट के साथ समस्या यह है कि आपको इसे सही ढंग से पेंट करने के लिए आरोही निर्णय और आधार रेखा को ध्यान में रखना होगा। क्षमा करें, मैं और अधिक सहायता नहीं कर सकता, मुझे आशा है कि ओरेकल पेज यह उपयोगी होगा।

+0

मैंने पहले उस लिंक को पढ़ा ... इससे मुझे उस बिंदु तक पहुंचने में मदद मिली जो वास्तव में मैं हूं। अगर आपको किताब का नाम याद है, तो मुझे बताएं। मेरी पत्नी कुछ भी नहीं कर रही है, वह किताबों की दुकान में दौड़ सकती है। :) –

+1

वैसे यह पुस्तक वास्तव में एंड्रॉइड के लिए एक डिजिटल ऐप थी और मुझे 'जावा प्रोग्रामिंग के लिए परिचय' कहा जाता था और यह थू जियान वियत था। यह मेरी पहली किताब थी और मेरा मानना ​​है कि फोंट के बारे में हिस्सा अंत के करीब कहीं है। मुझे नहीं पता कि इसमें बहुत कुछ शामिल है या नहीं। बीटीडब्ल्यू ऐप मुफ्त में है। – Roan

+0

वैसे यहां पुस्तक का एक ऑनलाइन संस्करण है: http://math.hws.edu/javanotes/ – Roan

संबंधित मुद्दे