提问人:Eljah 提问时间:11/13/2023 最后编辑:Eljah 更新时间:11/14/2023 访问量:36
在 Java swing 中显示 WebDings 字体不起作用,显示字形为空
Displaying WebDings font in Java swing isn't working, shown glyphs are empty
问:
代码为:
package ssl;
import javax.swing.*;
import java.awt.*;
public class WebDingsPhontGlyph extends JFrame {
public WebDingsPhontGlyph() {
setTitle("WebDings Phone Glyph");
setSize(200, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setFont(new Font("Webdings", Font.PLAIN, 50));
g2d.setColor(Color.BLUE);
g2d.drawString("^", 50, 100); // Phone glyph
g2d.drawString("É", 100, 100); // Messaging glyph
}
};
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
WebDingsPhontGlyph webDingsPhoneGlyph = new WebDingsPhontGlyph();
webDingsPhoneGlyph.setVisible(true);
});
}
}
而 JPanel 视图是,尽管我希望有特定的 WebDings 字形。
如果我使用其他字体名称,那肯定不会退出,比如
g2d.setFont(new Font("webdings33", Font.PLAIN, 50));
它使用 Arial 字体并显示字形。
我安装了Webdings:
String [] fonts = ge.getAvailableFontFamilyNames();
for (String fontname: fonts) {
System.out.println(fontname);
}
除其他外的输出
Trebuchet MS
TypoUpright BT
Verdana
Webdings
Wingdings
Wingdings 2
Wingdings 3
Yu Gothic
更新。
我正在尝试测试元数据:
Font webdingsFont = new Font("WebDings", Font.PLAIN, 12);
System.out.println(webdingsFont.isBold());
System.out.println(webdingsFont.isItalic());
System.out.println(webdingsFont.isTransformed());
System.out.println(webdingsFont.isPlain());
System.out.println(webdingsFont.getNumGlyphs());
System.out.println(webdingsFont.getStyle());
System.out.println(webdingsFont.getFamily());
for (int i = 0; i < 65536; i++) {
if (webdingsFont.canDisplay((char) i)) {
// g2d.drawString(Character.toString((char) i), 50, i*12); // Display the glyph at a specific position
System.out.println(i+" "+Character.toString((char) i));
}
}
我得到的不是 ,而是字体!Webdings
Wingdings
假
假
假
真
227
0
织带
9
10
13 8204 8205 61472 61473 61474 61475
如果我尝试加载一个真正的 Wingdings,我会得到完全相同的输出和可见的行为。因此,至少在我的 Windows 版本中,看起来 Wingdings 是作为 Webdings 安装的。
答:
1赞
VGR
11/14/2023
#1
Windows 字符映射表是为了“有用”而撒谎。(具有讽刺意味的是,它正在做相反的事情。
字符根本不在 ASCII 代码点。Wingdings 和 Webdings 通常将其字符放在从 U+F020 开始的 Unicode 专用区域。为每个字符添加0xf000以获得其在字体中的真实位置。
例如,使用 ,而不是 。代替 ,请使用 。"^"
String.format("%c", '^' + 0xf000)
"É"
String.format("%c", 'É' + 0xf000)
当然,也可以写和.我发现使用 String.format 并添加0xf000更容易理解和维护。"\uf05e"
"\uf0c9"
评论
"^"
String.format("%c", '^' + 0xf000)
"É"
String.format("%c", 'É' + 0xf000)