gpt4 book ai didi

java - swing 中的图标字体 : font icons not appear in JLabel

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:31 25 4
gpt4 key购买 nike

我正在用 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);

rendered icons: triangle in circle and paw print

因此,我使用图标字体生成器 (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);

我看到了什么?一些发布是成功的:

test run

test run

(每次运行我都会增加字体大小)

有些不是:

test run

test run

如您所见,在尺寸为 8 时我不能说会发生什么,开始尺寸为 9 - 由于某种原因根本没有绘制字符。

WTF?这是 swing 中的错误还是字体有问题?

最佳答案

因此,这不是已发现问题的解决方案,而是解决方法。我编写了自己的 swing 组件,它根据给定字体绘制给定字形:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.Rectangle2D;

public class FontIconGlyphButton extends JComponent
{
// to avoid wrong glyph codes
public interface FontIconGlyphCode
{
char toCharCode();
}

private final Color color;
private final Color hoverColor;
private final Color disabledColor;
private final Font font;

private GlyphVector vector;
private Rectangle2D size;
private FontIconGlyphCode iconCode;
private boolean hover = false;

public FontIconGlyphButton(Font font, FontIconGlyphCode iconCode, Color color, Color hoverColor, Color disabledColor)
{
this(font, iconCode, color, hoverColor, disabledColor, null);
}

public FontIconGlyphButton(Font font, FontIconGlyphCode iconCode, Color color, Color hoverColor, Color disabledColor, ActionListener listener)
{
this.font = font;
this.color = color;
this.hoverColor = hoverColor;
this.disabledColor = disabledColor;
setIconCode(iconCode);
addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
if(listener != null)
listener.actionPerformed(new ActionEvent(e.getSource(), e.getID(), Action.DEFAULT));
}

@Override
public void mouseEntered(MouseEvent e)
{
hover = true;
repaint();
}

@Override
public void mouseExited(MouseEvent e)
{
hover = false;
repaint();
}
});
}

public void setIconCode(FontIconGlyphCode iconCode)
{
this.iconCode = iconCode;
FontRenderContext context = new FontRenderContext(null, true, true);
vector = font.createGlyphVector(context, String.valueOf(iconCode.toCharCode()));
size = vector.getGlyphMetrics(0).getBounds2D();
repaint();
}

public FontIconGlyphCode getIconCode()
{
return iconCode;
}

@Override
protected void paintComponent(Graphics g1)
{
Graphics2D g = (Graphics2D) g1;
g.setColor(isEnabled() ? (hover ? hoverColor : color) : disabledColor);
g.drawGlyphVector(vector, (float) -size.getX(), (float) -size.getY());
}

@Override
public Dimension getMinimumSize()
{
return size.getBounds().getSize();
}

@Override
public Dimension getPreferredSize()
{
return size.getBounds().getSize();
}
}

关于java - swing 中的图标字体 : font icons not appear in JLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30491397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com