在Java Swing中使用AwesomeFont的自定义字体和Unicode字符为JButton添加图标?

14

我有一个JButton,我想给它添加一个图标。我想使用FontAwesome提供的基于字体的图标,该字体提供了一个TrueType字体文件。我正在尝试添加的图标是播放按钮图标,该图标在FontAwesome的css文件中为\f04b,我相信在Java中将其转换为\uf04b

这是我在IconButton基类的构造函数中加载字体的方式。

public class IconButton extends JButton {
  public IconButton() {
    try {
      InputStream in = this.getClass().getResourceAsStream("/fontawesome-webfont.ttf");
      Font ttfBase = Font.createFont(Font.TRUETYPE_FONT, in);
      Font ttfReal = ttfBase.deriveFont(Font.BOLD, 24);
      setFont(ttfReal);
    } catch (FontFormatException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
}

在实现类 StartButton 中,这是我设置文本的方法。

public class StartButton extends IconButton {
  public StartButton() {
    setText(String.valueOf('\u0f4b'));
    setForeground(Color.BLACK);
  }
}

这是我得到的。什么也没有。

JButton

非常感谢任何帮助。

编辑:请查看下面的答案。


那段第一段代码无法编译(createFont抛出的异常既未被捕获也未声明),而且这两个类的设计看起来很糟糕(1. 第一个类可以创建字体并将其缓存为静态属性;2. 如果它基于字符串定义了一个构造函数来调用超级构造函数,就可以完全避免第二个类)。或者,A. 由于 IconButton 设置了一个字体,而 StartButton 设置了前景色,因此使用标准的 JButton 并将每个按钮交给一个方法来配置外观。B. 使用新的 PLAF 或调整 UIManager - Andrew Thompson
代码并非直接从应用程序中提取,以减少噪音,但为了完整起见,我已更新它以包括try/catch。我还要补充说,我同意它只应创建一次字体。好建议。我需要研究PLAF和UIManger。 - rmontgomery429
"代码并非直接从应用程序中提取",在这种情况下最好用文字或伪代码(明确标注为伪代码)来描述它,而不是使用Java代码。更新它是个好决定。 :) " - Andrew Thompson
2个回答

12

我认为我已经解决了这个问题。正确的字符应该是\uf04b而不是\u0f4b。糟糕!:)

现在对我来说已经可行了。

带有播放图标的JButton


2
尝试在 http://jiconfont.github.io/ 使用 jIconFont(Swing 或 JavaFX)。
示例:
Icon icon = IconFontSwing.buildIcon(FontAwesome.FLOPPY_O, 15);

JButton button = new JButton(icon);

1
请不要将完全相同的答案复制粘贴到多个问题中。 - Andy
1
抱歉。当多个问题的答案完全相同时,我该如何继续? - Carlos Eduardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接