我正在用Java制作Swing应用程序,当然,包括按钮。我决定使用带有图标字体的JLabel来创建它们,以便具有良好的可伸缩性。我尝试了在标签中使用Font Awesome,它能够很好地工作:
Font font = Font.createFont(Font.TRUETYPE_FONT, int.class.getResourceAsStream("/fonts/fontawesome.ttf")).deriveFont(20f);
JFrame frame = new JFrame();
frame.setLayout(new FlowLayout(FlowLayout.TRAILING, 20, 20));
JLabel label1 = new JLabel("\uF144");
label1.setFont(font);
frame.add(label1);
JLabel label2 = new JLabel("\uF1B0");
label2.setFont(font);
frame.add(label2);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
所以,我去了图标字体生成器(Fontello)并选择了想要的图标。我将生成的字体添加到我的应用程序中,更改了代码并进行了测试运行……但是我没有看到它们:它们就是没有出现!
我编写了测试代码(我用红色边框制作了图标,以查看会发生什么):
final Font[] font = {Font.createFont(Font.TRUETYPE_FONT, int.class.getResourceAsStream("/fonts/fontello.ttf"))};
JFrame frame = new JFrame();
frame.setLayout(new FlowLayout(FlowLayout.TRAILING, 20, 20));
JLabel size = new JLabel("Size: " + font[0].getSize2D());
frame.add(size);
// I have 12 icons in font
JLabel[] labels = new JLabel[12];
int j = 0;
// There are codes of those icons
for(char i = '\uE800'; i <= '\uE80B'; i++)
{
JLabel label1 = new JLabel("" + i);
label1.setFont(font[0]);
label1.setBorder(new LineBorder(Color.RED, 1));
label1.setForeground(Color.black);
frame.add(label1);
labels[j++] = label1;
}
frame.add(new JButton(new AbstractAction("-1")
{
@Override
public void actionPerformed(ActionEvent e)
{
font[0] = font[0].deriveFont(font[0].getSize2D() - 1);
size.setText("Size: " + font[0].getSize2D());
for(JLabel label: labels)
{
label.setFont(font[0]);
}
}
}));
frame.add(new JButton(new AbstractAction("+1")
{
@Override
public void actionPerformed(ActionEvent e)
{
font[0] = font[0].deriveFont(font[0].getSize2D() + 1);
size.setText("Size: " + font[0].getSize2D());
for(JLabel label: labels)
{
label.setFont(font[0]);
}
}
}));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
我看到了什么?
有些启动是成功的:
(每次运行我都增加字体大小)
有些则不是:
正如你所看到的,当字体大小为8时,我无法说出发生了什么,从大小9开始-由于某种原因,字符根本没有被绘制。
怎么回事?这是swing中的一个bug还是字体存在问题?