我需要使用graphics2d绘制一个特殊字符,但有些字符不可用。例如,角色➿呈现为方框:
这是我的代码:
private void drawIcon(Graphics2D g2d) {
g2d.setColor(iconColor);
g2d.setFont(iconFont);
FontMetrics fm = g2d.getFontMetrics();
Rectangle2D r = fm.getStringBounds(icon, g2d);
int x = (int) ((getSize().getWidth() - (int) r.getWidth()) / 2);
int y = (int) ((getSize().getHeight() - (int) r.getHeight()) / 2 + fm.getAscent());
System.out.println(x + " " + y);
System.out.println(icon);
g2d.drawString(icon, x, y);
}
例如, icon 是字符串“\ u27BF”,应显示为“➿”。
如何在代码中添加对此字符的支持?
答案 0 :(得分:2)
查找包含您的角色的可自由再发行(例如开源)TrueType字体。假设字体许可证允许它,你可以采用包含你的角色的现有字体,并将其子集化为只需要你需要的角色 - 例如使用Font Optimizer。或者,您可以使用字体设计工具(例如FontForge)创建自己的包含此字符的字体。
然后您可以将字体作为资源嵌入JAR中,并按以下方式加载:
InputStream inp = getClass().getResourceAsStream("/com/example/myfont.ttf");
Font font = Font.createFont(Font.TRUETYPE_FONT, inp).deriveFont(18f);
g2d.setFont(font);
deriveFont()
调用是因为默认情况下加载的字体大小很小(1点),因此将其调整为18点。
当然,不是每次要绘制时都加载它,而是应该加载一次,比如在构造函数或静态初始化器中,然后将它存放在一个字段中供绘图例程使用。
这样,无论用户安装了什么字体,您的角色都应该在所有平台上都可见,而且在所有平台上也应该看起来相同(或非常相似)。