如何解决如何在Mac OS的Java Swing小部件中渲染表情符号?
我这里有一个简单,完整,独立的纯Java程序,它显示一个框架,其中包含带有Unicode表情符号字符作为文本的按钮。该程序可以正确运行并在Windows上显示表情符号,但在Mac OS(Catalina,AdoptOpenJDK15)上则不能显示。
这里是源代码;文件名是EmojiTest.java:
import java.awt.*;
import javax.swing.*;
public class EmojiTest {
public static void main(String[] args) {
// listFonts(); // Uncomment if you want to see all registered fonts.
JFrame frame = new JFrame();
frame.setTitle("Emoji Demo: " + System.getProperty("os.name"));
frame.setSize(400,300);
JButton button = new JButton();
String emoji = "\ud83d\udc36"; // dog face
button.setText(emoji);
button.setFont(getFont(emoji));
JPanel holder = new JPanel(); // Let button be natural size
holder.add(button);
frame.getContentPane().add(holder);
frame.setVisible(true);
}
static Font getFont(String emoji) {
String os = System.getProperty("os.name");
String fontFamily = os.equals("Mac OS X") ? "Apple Color Emoji" : "Segoe UI Emoji";
Font font = new Font(fontFamily,Font.PLAIN,20);
System.out.println("Font: " + font);
System.out.println("can display result: " + font.canDisplayUpTo(emoji));
return font;
}
static void listFonts() {
String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getAvailableFontFamilyNames();
for (int i = 0; i < fonts.length; i++) {
System.out.println(fonts[i]);
}
}
}
这里要注意几件事:
-
getFont()
辅助方法将打印出字体是否认为可以显示文本。在MacOS上,它始终打印-1,表示它认为可以显示文本。 -
我的Apple系统上的所有279种字体都声称(可以通过
canDisplayUpTo
来显示,但是无法显示。是的,我以视觉方式测试了它们,但没有,没有一个起作用。 -
从图片中可以看到,该程序在Windows上可以正常运行。因此,该代码是“正确的”,从某种意义上说,它们应该在Mac上可以正常工作。
我相当确信这是一个JDK错误。但是,如果您在IntelliJ中调试EmojiTest程序,它实际上会在调试窗格中向您显示该文本实际上是正确的表情符号:
因此IntelliJ是在Mac OS Catalina上运行的Java程序,能够正确地以其字体正确呈现表情符号,但不能在JButton中。但是我也尝试过在JTextPanes和MacOS上的其他Swing小部件中渲染表情符号,但无济于事。
在过去的几年中,这个问题经常被间接问过几次,但是答案总是“您需要确保您的字体可以显示表情符号”。
我认为该程序非常清楚地证明了能够显示表情符号的字体不是问题。 Apple Color Emoji字体可以绝对显示表情符号,包括该表情符号。它似乎无法用Java做到。
这是我的问题:如何修改此EmojiTest.java程序以在MacOS上显示表情符号?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。