我不太确定我理解 g.drawString。
我有一个程序可以写入预印表格。用户声称打印不规则……即表格上的文本高于/低于之前的打印。就个人而言,我认为他们错误地加载了表单,但由于他们付钱让我编写代码,我正在测量表单并将尺寸转换为像素并重写处理打印的部分。
要正确打印表格,c.getCostAmount() 必须打印在 c.getAppraisersAmount() 上方一个像素,以便它出现在它下方一行。然而,每条后续线都比它低 4 毫米(或大约 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*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;
}
最佳答案
我不确定你是如何确定 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 时,将导致设备像素数匹配一英寸。
关于java - 打印成物理形式——需要基本的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26531595/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht