Java 打印到物理形式--需要基本的理解

Java 打印到物理形式--需要基本的理解,java,printing,Java,Printing,我不太清楚我是否理解g.拉丝 我有一个程序,可以写预印的表格。用户声称打印是不规则的…即表单上的文本高于/低于上一次打印。就我个人而言,我认为他们误装了表单,但由于他们付钱给我写代码,我正在测量表单,将尺寸转换为像素,并重写处理打印的部分 要正确打印表单,必须将c.getCostAmount()打印在c.GetAssessAmount()上方一个像素处,使其显示在其下方一行。然而,接下来的每一行都比这一行低4毫米(约15像素) 我的问题是,我不理解垂直距离,也不理解为什么第三行必须在前一行的上方

我不太清楚我是否理解g.拉丝

我有一个程序,可以写预印的表格。用户声称打印是不规则的…即表单上的文本高于/低于上一次打印。就我个人而言,我认为他们误装了表单,但由于他们付钱给我写代码,我正在测量表单,将尺寸转换为像素,并重写处理打印的部分

要正确打印表单,必须将c.getCostAmount()打印在c.GetAssessAmount()上方一个像素处,使其显示在其下方一行。然而,接下来的每一行都比这一行低4毫米(约15像素)

我的问题是,我不理解垂直距离,也不理解为什么第三行必须在前一行的上方放置一个像素,才能位于下方

有人有快速简单的解释或者教程/解释的链接吗

非常感谢

代码(h/t Alex,):


我自己也不太擅长,但在我读的一本书中,有一个关于tekst的非常好的解释,以及它在绘画时的表现。我寻找了一个微笑的解释,我从甲骨文找到了一个。这是:
虽然没那么好,但确实很了不起。tekst的问题是,您需要考虑ascend Decent和baseline才能正确绘制它。很抱歉,我不能提供更多帮助,我希望Oracles page能提供足够的帮助。

我不确定您是如何确定
毫米像素值的,我觉得它完全可疑

但是,让您困惑的错误只是缺少大括号:

您可以使用以下术语:
((int)毫米像素*23)
((int)毫米像素*24)
,以及
((int)(毫米像素*22))

请注意,前两个术语在乘积
mm\u IN\u PIXELS*...
周围缺少大括号,这意味着您首先将
mm\u IN\u PIXELS
转换为
int
,获取值
3
,然后进行乘法,而不是先执行
乘法,然后转换为
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个用户空间像素转换为1英寸的转换,因此当将转换应用于
72
时,将导致设备像素数与1英寸匹配。

我个人不知道,但我很想知道答案是什么!我的明星,为你干杯!我以前读过这个链接……实际上,它帮助我达到了我现在的状态。如果你记得那本书的名字,请告诉我。我妻子什么也不做,她可以跑去书店这本书实际上是一款android的数字应用程序,我被称为“java编程入门”,作者是thu gian Vieta。这是我的第一本书,我相信关于字体的部分已经接近尾声了。我不知道它是否涵盖了更多的内容。顺便说一句,这个应用是免费的。顺便说一句,这里有本书的在线版本:我在网上找到了这本书的章节。这里是:我认为你的问题与领先的物业有关。出色!谢谢那就是问题所在。感谢您解决了这个问题,并加强了我对Java理解的信心。括号的优先级高于cast,但cast优先于乘法(这里不适用指数,因为Java中没有这样的运算符)。顺便说一句,如果有疑问,您可以在任何内容周围加上括号,然后在Eclipse中按CTRL+1,然后从弹出菜单中选择“删除额外括号”,这将删除所有过时的括号,但保留所有必要的括号。
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();