Java swing中的图标字体:字体图标不显示在JLabel中
当然,我正在用java制作swing应用程序,带有按钮。我决定让他们通过JLabel与图标字体良好的可伸缩性。我尝试使用标签字体,效果很好:Java swing中的图标字体:字体图标不显示在JLabel中,java,swing,fonts,Java,Swing,Fonts,当然,我正在用java制作swing应用程序,带有按钮。我决定让他们通过JLabel与图标字体良好的可伸缩性。我尝试使用标签字体,效果很好: Font font = Font.createFont(Font.TRUETYPE_FONT, int.class.getResourceAsStream("/fonts/fontawesome.ttf")).deriveFont(20f); JFrame frame = new JFrame(); frame.setLayout(new FlowLayo
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=新JFrame();
frame.setLayout(新的FlowLayout(FlowLayout.TRAILING,20,20));
JLabel size=newjlabel(“size:+font[0].getSize2D());
帧。添加(大小);
//我有12个字体图标
JLabel[]标签=新的JLabel[12];
int j=0;
//这些图标都有代码
对于(char i='\uE800';iSo,这不是已发现问题的解决方案,而是解决方法。我编写了自己的swing组件,用于从给定字体绘制给定glyph:
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();
}
}
为什么你要用标签而不是按钮来制作按钮?因为我不需要删除按钮背景绘画(如“-1”“+1”按钮)。好的,但它们不是真正的按钮。无论如何,你能提供复制此按钮所需的资源文件吗?当然,它是“蒙版”按钮:)有字体:当我们在这里进行调查时,我将GlyphVector(似乎这很正常)与JComponent一起使用来实现我的目标(它也是“屏蔽”按钮:)。不是使用JComponent中的MouseeEvents来使用未修饰的JButton,而是使用ChangeListener中的ButtonModel
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();
}
}