除非从 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 不会加粗文本的主要内容,如果未能解决你的问题,请参考以下文章
Java Scanner - 除非存在引号,否则用空格分隔?
除非应用程序从通知中恢复,否则不会调用 didReceiveRemoteNotification