我不太确定我理解g.drawString.

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

要正确打印表单,c.getCostAmount()必须打印一个像素ABOVE c.getAppraisersAmount(),使其在其下方显示一行.然而,每个后续行低于4mm(或大约15个像素).

我的问题是我不理解垂直距离以及为什么第3行必须放在上一行之上的像素才能使其位于下方.

任何人都有一个快速简单的解释或指向教程/解释的链接?

非常感谢!

代码(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*22)));

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

    strWidth = SwingUtilities.computeStringWidth(metrics,df.format(c.getofficersAmount()));
    g.drawString(df.format(c.getofficersAmount()),((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*44)));

    return PAGE_EXISTS;
}

解决方法

我不确定你是如何确定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,然后乘以,而不是先执行双乘,然后转换为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英寸匹配.

java – 打印到物理形式 – 需要基本的理解的更多相关文章

  1. 如何在ANDROID中获得屏幕宽度dpi?

    我这样做,所以假设我的densitydpi是120..和widthpixel240..通过计算得到240/0.75…然而情况并非如此……我认为widthdpi小于320…因为320在屏幕上跟我错了….使用120个作品.在Nexus4上……我除以768/2,得到384正确的宽度密度dpi但在其他像240,160,120密度dpi…widthdpi的计算似乎是错误的…

  2. Android:水平中心gridview

    我需要在我的Androidlayout.xml中水平地对齐网格视图.我已经搜索google了很长一段时间,但没有成功找到答案.我只能通过改变strechMode来改变gridview水平位置,但是我的项目不是靠近的.我需要的是物品是一个靠近另一个并且水平居中.我选择strechmode=none,所以现在我的项目是彼此靠近,但它们在屏幕的左边,我只是希望他们水平居中.这是我的布局xml:这是由图像适配器在gridview上设置的图像的片段:我怎么能成功?

  3. Windows上的“正确”对话框/ UI字体

    当使用CreateWindow动态创建一个控件时,它通常以一个丑陋的字体开始.通常我通过抓取父对话框的字体并将其设置为控件来解决这个问题–我甚至不能说这是不是一个好主意.我如何“合法”获取正确的字体?

  4. php – 如何使用imagick annotateImage中文文本?

    我需要使用中文文本注释图像,我现在正在使用Imagick库.中文文本的一个例子是这是中文使用的中文字体文件是this该文件最初名为华文黑体.ttf它也可以在MacOSX的/Library/Font下找到我已将其重命名为英语STHeiTi.ttf,可以更轻松地在PHP代码中调用该文件.特别是theImagick::annotateImagefunction我也是usingtheanswerfrom“

  5. 休息 – Azure Microsoft Insights API 2016-09-01收集指标时出错

    请帮助我理解为什么从最近几天AzureMicrosoftInsightsAPI2016-09-01发出以下错误{“code”:“BadRequest”,“message”:“只有’eq‘形式的条件允许,其中=’timeGrain’,’startTime’,’endTime’,’name.value’,’aggregationType’,’debugRegion

  6. junit – 指定端口时Spring Boot Actuator端点的单元测试无效

    最近我改变了我的springboot属性来定义一个管理端口.这样做,我的单元测试开始失败:(我编写了一个测试/metrics端点的单元测试,如下所示:以前这是过去了.添加后:测试开始失败:我尝试用以下方法更改@SpringBoottest注释:server.port使用的编号在哪里.这似乎没有任何区别.然后将属性文件中的management.port值更改为与server.port相同.结果相同.让测试工作的唯一方法是从属性文件中删除management.port.有什么建议/想法吗?

  7. java – 打印到物理形式 – 需要基本的理解

    我不太确定我理解g.drawString.我有一个写入预打印表单的程序.用户声称打印是不规则的…

  8. python – 获得scikit-learn中多标签预测的准确性

    在multilabelclassification设置中,sklearn.metrics.accuracy_score仅计运算符集精度(3):即,为样本预测的标签集必须与y_true中的相应标签集完全匹配.这种计算精度的方法有时被命名,可能不那么模糊,精确匹配率(1):有没有办法让其他典型的方法来计算scikit-learn的准确性,即(如(1)和(2)中所定义,并且不那么模糊地称为汉明分数(4)

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部