2014-10-23 8 views
7

Nie jestem całkiem pewien, że rozumiem g.drawString.Drukowanie do postaci fizycznej - potrzebujesz podstawowego zrozumienia

Mam program, który zapisuje do formularza z nadrukiem. Użytkownicy twierdzą, że druk jest nieregularny ... tzn. Tekst na formularzu jest wyższy/niższy niż poprzedni wydruk. Osobiście uważam, że źle opisują formularz, ale ponieważ płacą mi za pisanie kodu, mierzę formę i konwertuję wymiary na piksele i przepisuję część, która zajmuje się drukiem.

Aby wydrukować poprawnie formularz, c.getCostAmount() musi być wydrukowany jeden piksel ABOVE c.getAppraisersAmount(), aby pojawił się w jednej linii poniżej. Jednak każda następna linia ma 4 mm (lub około 15 pikseli) poniżej.

Mój problem polega na tym, że Nie rozumiem odległości w pionie i dlaczego trzecia linia musi być umieszczona w pikselu powyżej poprzedniej linii, aby znajdowała się pod spodem.

Ktoś ma szybkie wyjaśnienie lub link do samouczka/wyjaśnienia?

Wielkie dzięki!

Kod (h/t Alex, 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

Osobiście nie wiem, ale jestem zainteresowany, aby usłyszeć, jaka jest odpowiedź! Gwiazdy ode mnie i okrzyki dla ciebie! – DreadHeadedDeveloper

Odpowiedz

0

Nie jestem pewien, jak określiłeś tę wartość MILLIMETER_IN_PIXELS, wydaje mi się to całkowicie podejrzane.

jednak błąd, który myli cię to po prostu przypadek brakujących szelek:

używać terminów: ((int) MILLIMETER_IN_PIXELS*23), ((int) MILLIMETER_IN_PIXELS*24) i ((int) (MILLIMETER_IN_PIXELS*22)).

Należy zauważyć, że dwa pierwsze warunki brakuje nawiasów wokół produktu MILLIMETER_IN_PIXELS*… czyli rzucasz MILLIMETER_IN_PIXELS do int pierwsze, uzyskanie wartości 3, a następnie pomnożyć, zamiast przeprowadzać double mnożenie pierwszy i oddające do int wtedy.

Dlatego błędy zaokrąglania są różne. Uzyskane wartości są następujące: 69, 72, ,.

Należy zauważyć, że błąd brakujących nawiasów klamrowych pojawia się również w innym miejscu, dotyczy to także pozycji poziomych.


jako dodatek, oto jak można dostać prawdziwego dpi:

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(); 

Objaśnienie: transformacja domyślny jest określony jako transformacja, która przekształci 72 przestrzeni użytkownika piksel na jeden cal, więc kiedy zastosowanie transformacji do 72, spowoduje to, że liczba pikseli urządzenia dopasowana do jednego cala.

+0

To jest CPEMDAS? :) –

+0

To był problem, więc. Dziękuję, zarówno za rozwiązanie tego, jak i wzmocnienie mojej wiary w moje rozumienie Javy. –

+1

Nawiasy mają wyższy priorytet niż rzut, ale rzut jest przed mnożeniem (wykładnik nie ma tutaj zastosowania, ponieważ nie ma takiego operatora w Javie). Przy okazji, jeśli masz wątpliwości, możesz umieścić nawiasy wokół dowolnego elementu, a następnie naciśnij CTRL + 1 w Eclipse i wybierz "Usuń dodatkowe nawiasy" z menu podręcznego, które usunie wszystkie nieaktualne nawiasy klamrowe, ale zachowaj wszystkie niezbędne. – Holger

0

Nie jestem dobry w tym ja też, ale w książce czytałem był tam naprawdę dobry explination o tekst i jak się zachowuje, gdy namalowany. Szukałem szaleńczej eksploracji i znalazłem jedną z Oracle. Oto ona: http://docs.oracle.com/javase/tutorial/2d/text/measuringtext.html To nie jest tak dobre, ale jest coś. Problem z tekstem polega na tym, że musisz wziąć pod uwagę wzrost decend i linię bazową, aby poprawnie go pomalować. Przykro mi, ale nie mogę być bardziej pomocny, mam nadzieję, że Oracles będzie wystarczająco pomocny.

+0

Przeczytałem ten link wcześniej ... pomogło mi dojść do punktu, w którym teraz jestem. Jeśli pamiętasz nazwę książki, daj mi znać. Moja żona nic nie robi, może pobiec do księgarni. :) –

+1

Cóż, książka była tak naprawdę cyfrową aplikacją dla Androida i zostałem nazwany "wprowadzeniem do programowania java", a było to przez Thu Gian Viet. To była moja pierwsza książka i uważam, że część dotycząca czcionek jest gdzieś blisko końca. Nie wiem, czy to obejmuje znacznie więcej. przy okazji aplikacja jest za darmo. – Roan

+0

Przy okazji jest wersja online książki tutaj: http://math.hws.edu/javanotes/ – Roan