除非从 NetBeans 运行,否则 Java Canvas drawString 不会加粗文本

Posted

技术标签:

【中文标题】除非从 NetBeans 运行,否则 Java Canvas drawString 不会加粗文本【英文标题】:Java Canvas drawString won't bold text unless running from NetBeans 【发布时间】:2018-11-12 16:35:01 【问题描述】:

我正在 Java Canvas 上制作一个在线多人游戏(没什么复杂的,只是一个自上而下的坦克射击游戏)。你会认为我是来这里询问有关网络、套接字等问题的,但我比这更进一步,而且我遇到了一些奇怪的事情。

基本上,我在画布上用粗体绘制了一些字符串。当我从 NetBeans 运行它(不构建,只需按 F6/绿色运行按钮)时,文本显示为粗体。但是,当我构建项目并运行 JAR 文件时,文本不是粗体。

注意:

我尝试更新 Java,因为我落后了很多更新。没修好。

这里有一个代码 sn-p 表明我正确地绘制了粗体文本,但我不知道我还需要为这类问题显示什么,因为代码不可能是问题。

g.setFont(new Font("TimesRoman", Font.BOLD, 50));
g.setColor(Color.red);
g.drawString("Connection Failed.", x, y);

TL;DR - 运行 JAR 文件时在画布上绘制粗体文本不是粗体,但从 NetBeans 运行时是这样。

感谢所有帮助。谢谢!

【问题讨论】:

您使用的是BufferStrategy吗? 我使用普通和粗体字体做了一个非常快速的测试,没有任何问题。考虑提供Minimal, Complete, and Verifiable example,这将有助于我们更好地了解您的问题,并为您提供更好的机会为您的问题找到合适的答案 请先阅读有用的标签弹出窗口,然后再将它们放在问题上。如果你有,你就会意识到这与jcanvas无关! @MadProgrammer 是的,我正在使用 BufferStrategy。 @AndrewThompson 那是我的错,我不是故意选择那个!对不起。 【参考方案1】:

看起来您可能正在绘制函数中创建字体。鉴于绘制函数每秒可能被调用多次,这可能是源效率低下,并且可能是资源匮乏。在创建类时创建 Font,可能作为静态资源,然后在每次绘制调用中使用相同的字体对象。

Graphics 对象在绘制对象时允许走捷径,以提高效率为名。这可以包括不加粗大字体,不在对角线上使用抗锯齿等。速度为王。当然,你可以告诉图形引擎你更关心外观而不是速度,使用Graphics2D.setRendingHint(...)

import static java.awt.RenderingHints.*;

void paint(Graphics g) 
    Graphics2D g2d = (Graphics2D) g;

    g2d.setRendingHint(KEY_RENDERING, VALUE_RENDERING_QUALITY);
    g2d.setRendingHint(KEY_TEXT_ANTIALIAS, VALUE_TEXT_ANTIALIAS_ON);

您可以使用setRendingHints(Map hints) 一次设置多个提示。

【讨论】:

我按照您的建议做了一切,但似乎没有任何改变。我明白你的意图,但我看不到优化和渲染提示如何改变它在作为测试运行和运行实际 JAR 文件时的不同行为方式。据我所知,它们不应该运行相同吗? 运行单元测试时,JVM 不会在测试之间重新启动。在一个单元测试中更改的设置可能会影响另一个单元测试。正确编写的单元测试应该使 JVM 保持其原始状态,但可能会意外更改 JVM 设置、默认值等等。 NetBeans 可能 NetBeans 可能会在非标准 JVM 状态下启动测试。问题是需要哪种设置、选项和控制来获得所需的结果。您可以尝试其他渲染提示。但请张贴minimal reproducible example 和正确和错误外观的图像,以便我们重现问题并希望修复。否则,我们只能猜测。

以上是关于除非从 NetBeans 运行,否则 Java Canvas drawString 不会加粗文本的主要内容,如果未能解决你的问题,请参考以下文章

除非用户登录,否则钥匙串不会从 Jenkins 脚本解锁

Java Scanner - 除非存在引号,否则用空格分隔?

NetBeans - 按钮选择数据库,否则

除非应用程序从通知中恢复,否则不会调用 didReceiveRemoteNotification

除非调整大小,否则框架不显示组件 (JAVA AWT)。无法修复

除非之前按下,否则按下运行按钮不会提高速度