Non sono sicuro di aver capito g.drawString.Stampa su modulo fisico: è necessario conoscere le basi
Ho un programma che scrive su un modulo prestampato. Gli utenti affermano che la stampa è irregolare ... cioè, il testo sul modulo è più alto/più basso rispetto alla stampa precedente. Personalmente, penso che stiano caricando male il modulo, ma dal momento che mi pagano per scrivere codice, sto misurando il modulo e convertendo le dimensioni in pixel e riscrivendo la parte che si occupa della stampa.
Per stampare correttamente il modulo, c.getCostAmount() deve essere stampato un pixel SOPRA c.getAppraisersAmount() affinché appaia una riga sotto di esso. Tuttavia, ogni linea successiva è di 4 mm (o circa 15 pixel) al di sotto di quella.
Il mio problema è che non capisco le distanze verticali e perché la 3a riga deve essere posizionata un pixel sopra la riga precedente perché si trovi al di sotto.
Chiunque ha una spiegazione rapida o semplice di un tutorial/spiegazione?
Grazie mille!
Il codice (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;
}
Personalmente, non lo so, ma mi interessa sapere quale sia la risposta! Star da me e applausi a te! – DreadHeadedDeveloper