2014-10-23 3 views
7

Я не совсем уверен, что понимаю g.drawString.Печать на физическую форму - требуется базовое понимание

У меня есть программа, которая записывается в предварительно напечатанную форму. Пользователи утверждают, что печать является нерегулярной ... т. Е. Текст в форме выше/ниже, чем предыдущий. Лично я думаю, что они неправильно загружают форму, но поскольку они платят мне за код, я измеряю форму и преобразую размеры в пиксели и переписываю часть, которая имеет дело с печатью.

Чтобы напечатать форму правильно, c.getCostAmount() должен быть напечатан на один пиксель ABOVE c.getAppraisersAmount(), чтобы он отображался на одной строке под ним. Тем не менее, каждая последующая линия составляет 4 мм (или примерно 15 пикселей) ниже этого.

Моя проблема в том, что Я не понимаю вертикальные расстояния и почему 3-я строка должна быть размещена над предыдущей строкой, чтобы она находилась под ней.

У кого-нибудь есть краткое объяснение или ссылка на учебник/объяснение?

Большое спасибо!

Код (ч/т 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

Лично я не знаю, но мне интересно узнать, что ответ! Звезда от меня и приветствую вас! – DreadHeadedDeveloper

ответ

0

Я не уверен, как вы определили, что значение MILLIMETER_IN_PIXELS, это выглядит совершенно подозрительно для меня.

Однако ошибка, которая сбивает с толку вас просто случае отсутствия скобок:

Вы используете термины: ((int) MILLIMETER_IN_PIXELS*23), ((int) MILLIMETER_IN_PIXELS*24) и ((int) (MILLIMETER_IN_PIXELS*22)).

Обратите внимание, что первые два члена не имеют фигурные скобки вокруг продукта MILLIMETER_IN_PIXELS*…, который означает, что вы бросили MILLIMETER_IN_PIXELS к int первых, получить значение 3 и умножать то, вместо выполнения double умножения первого и приведение к int тогда.

Поэтому ошибки округления различны. Результирующие значения: 69, 72, 83.

Обратите внимание, что погрешность отсутствующих фигурных скобок появляется и в каком-либо другом месте, а также на горизонтальные позиции.


В качестве дополнения, вот как вы получите реальный 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(); 

Объяснение: преобразование по умолчанию определяется как преобразование, которое преобразует 72 пользовательского пространства пикселей на один дюйм, так что, когда применяя преобразование к 72, это приведет к количеству пикселей устройства, соответствующих одному дюйму.

+0

Итак, это CPEMDAS? :) –

+0

Это была проблема. Спасибо, за то, что решили и укрепили свою веру в мое понимание Java. –

+1

Скобки имеют более высокий приоритет, чем приведение, но приведение происходит до умножения (экспонента здесь не применяется, так как в Java нет такого оператора). Кстати, если вы сомневаетесь, вы можете поместить круглые скобки вокруг чего-нибудь, а затем нажмите CTRL + 1 в Eclipse и выберите «Удалить дополнительные скобки» из всплывающего меню, которое удалит все устаревшие фигурные скобки, но сохранит все необходимые. – Holger

0

Im не так хорош в этом сам тоже, но в книге я читал там был действительно хороший explination о TEKST и как он ведет себя, когда окрашена. Я искал знакомое объяснение, и я нашел его у Oracle. Вот оно: http://docs.oracle.com/javase/tutorial/2d/text/measuringtext.html Это не так хорошо, но это что-то. Проблема с tekst заключается в том, что вам необходимо принять во внимание decend decend и baseline, чтобы правильно ее нарисовать. Извините, я не могу больше помогать, я надеюсь, что страница «Оракула» достаточно полезна.

+0

Я читал эту ссылку ранее ... это помогло мне понять, что я сейчас, на самом деле. Если вы помните имя книги, дайте мне знать. Моя жена ничего не делает, она может бежать в книжный магазин. :) –

+1

Ну, на самом деле книга была цифровым приложением для андроида, и меня называли «знакомство с программированием на Java», и это было thu gian viet. Это была моя первая книга, и я считаю, что часть шрифтов находится где-то ближе к концу. Я не знаю, покрывает ли он гораздо больше. Кстати, приложение бесплатно. – Roan

+0

Кстати, есть онлайн-версия книги здесь: http://math.hws.edu/javanotes/ – Roan

Смежные вопросы