• category: swing folder: FontCanDisplay title: FontがUnicodeコードポイントで指定した文字のグリフを持って表示可能か確認する tags: [Font] author: aterai pubdate: 2021-04-26T19:47:27+09:00 description: FontにUnicodeコードポイントで指定した文字のグリフが存在し、かつ表示可能か確認します。 image: https://drive.google.com/uc?id=1BR9NZACpykg8UXFiiAI7pFRE9UitBIbc

概要

FontUnicodeコードポイントで指定した文字のグリフが存在し、かつ表示可能か確認します。

サンプルコード

int code = 0x1F512;
JLabel label = new JLabel(new String(Character.toChars(code)));
label.setFont(label.getFont().deriveFont(24f));
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setVerticalAlignment(SwingConstants.CENTER);

String[] columnNames = {"family", "name", "postscript name", "canDisplay", "isEmpty"};
DefaultTableModel model = new DefaultTableModel(null, columnNames) {
  @Override public boolean isCellEditable(int row, int column) {
    return false;
  }

  @Override public Class<?> getColumnClass(int column) {
    return column > 2 ? Boolean.class : String.class;
  }
};
JTable table = new JTable(model);
Font[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
Stream.of(fonts)
    .map(f -> {
      String txt = new String(Character.toChars(code));
      FontRenderContext frc = getFontMetrics(f).getFontRenderContext();
      return new Object[] {
          f.getFamily(),
          f.getName(),
          f.getPSName(),
          f.canDisplay(code),
          f.createGlyphVector(frc, txt).getVisualBounds().isEmpty()
      };
    })
    .forEach(model::addRow);
View in GitHub: Java, Kotlin

解説

上記のサンプルでは絵文字ロック🔒U+1F512がフォント一覧から選択したフォントで表示可能かをテストしています。

  • 4列目: Font.canDisplay(int codePoint)
    • このFontに指定された文字のグリフが含まれているかどうかを調べる
    • falseの場合フォントが指定するゲタ文字が表示される
  • 5列目: GlyphVector#getVisualBounds()#isEmpty()
    • グリフのサイズが0かを調べる
    • 日本語環境のUbuntu 29.04でフォントをSerifに指定するとFont.canDisplay(int codePoint)trueになるが、GlyphVector#getVisualBounds()はサイズ0で絵文字が表示されない場合がある?

参考リンク

コメント