如果您只是使用 new Font("Arial", Font.PLAIN, 10)
创建字体,稍后,当您尝试显示该字体中缺少的字形时,您将得到熟悉的方 block 表明缺少字形。
很久以前,我们找到了解决此问题的解决方法 - 将字体传递给 FontUtilities.getCompositeFontUIResource(Font)
,然后您会得到一个处理字符回退的 Font
字体本身不包含这些内容。
问题是,该实用程序位于 sun.font
中,我想消除编译器警告。
鉴于已经过去很多年了,现在有合适的方法来做到这一点吗?
演示:
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import sun.font.FontUtilities;
public class TestFonts implements Runnable
{
@Override
public void run()
{
Font font = new Font("Arial", Font.PLAIN, 20);
JLabel label1 = new JLabel("Before \u30C6\u30B9\u30C8");
label1.setFont(font);
JLabel label2 = new JLabel("After \u30C6\u30B9\u30C8");
label2.setFont(FontUtilities.getCompositeFontUIResource(font));
JFrame frame = new JFrame("Font Test");
frame.setLayout(new GridLayout(2, 1));
frame.add(label1);
frame.add(label2);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new TestFonts());
}
}
结果:
最佳答案
在深入研究 JDK 源代码后,我发现了一个直接调用内部方法的公共(public)方法。我不知道这被认为有多狡猾,但它至少是公共(public) API。 :)
label2.setFont(StyleContext.getDefaultStyleContext()
.getFont(familyName, style, size));
关于java - 是否有与 FontUtilities.getCompositeFontUIResource(Font) 等效的非专有等效项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35165617/