ラズパイ BlueJ でメニューにとうふが表示されて困ってますか?

BlueJ を知っている人っているのですかね。「Java新入門-学習環境BlueJでスイスイ」といった書籍もあるようなので、まったく知られていないということもなさそうですけど… BlueJ は、Java 入門用のツールなのですが、クラス図を作成しながらプログラムを作っていくというなかなか優れたツールです。確か、ベースが NetBeans なんですよね。

さて、Raspberry Pi 400 のスターターキットを入手したところ、Raspberry Pi OS の Full 版の microSD カードがついていて、久しぶりに BlueJ をみかけました。「懐かしいなぁ」と思いながら起動したら、どうしたことでしょう、メニューが豆腐になって表示されているではありませんか。

「おやおや、フォントの設定で問題ですかぁ」と思いながら、調べて解決してみました。他の解決方法もあると思いますが、自分の方法は手軽な方だと思います。

それで、Raspberry Pi OS の BlueJ の設定ファイルは /usr/share/bluej/bluej.defs にあります。設定できる項目はこれを見るとわかります。

$ less /usr/share/bluej/bluej.defs

bluej.defs を直接編集するのではなく、カスタマイズは ~/.bluej/bluej.properties を編集します。項目は bluej.defs にあるものを指定できます。ちなみに、BlueJ を起動して終了すると、このファイルは上書きされて同期されますから、注意しましょう。

$ less ~/.bluej/bluej.properties

日本語で表示する必要がないなら、bluej.language=english を bluej.properties へ追加するのが手軽です。一度、この設定をして起動すると、各メニューが英語で表示されてわかるようになります。

bluej.language=english

日本語表示をする場合は /usr/share/bluej/fonts/ に使用するフォントを置いて、bluej.properties に関係する指定を設定する必要があります。ここでは、JetBrains Mono を使うとして次のように指定します。指定する値はフォントのファミリー名かフォント名のようです。

bluej.language=japanese
bluej.menu.font=JetBrains Mono
bluej.terminal.font=JetBrains Mono
bluej.editor.font=JetBrains Mono

フォントのファミリー名やフォント名は Java のプログラムで確認するのが確実です。FontList.java を用意します。

import java.awt.GraphicsEnvironment;
import java.awt.Font;

public class FontList {
  public static void main(String[] args) {
    System.out.println("---- FontFamilyName");
    String fonts[] = 
      GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    for (int i = 0; i < fonts.length; i++) {
      System.out.println(fonts[i]);
    }
    System.out.println("---- FontName");
    Font[] f = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
    for (int i = 0; i < f.length; i++) {
      System.out.println(f[i].getFontName());
    }
  }
}

コンパイルして実行すると、現在のシステムで使えるフォントの一覧が表示されます。ただし、ここで表示されるフォントについて BlueJ で使えるわけではないようです。どうやら、/usr/share/bluej/fonts/ に使用するフォントを置く必要があるようです。

$ javac FontList.java
$ java FontList
(略)

BlueJ で認識するフォントについては、bluej.defs ファイルにあるコメントによると ttf ファイルの用意が必要そうです。日本語用のフォントとしては Noto のフォントが Raspberry Pi OS ではインストールされているのですが、ttc ファイルでした。ttf ファイルを取り出すこともできますが、簡単な方法がちょっとわからなかったので、別のフォントを使うことにします。

プログラミング用のフォントとしては、Cicaのフォント、JetBrains Monoのフォントというのがあって、いずれも無償で利用ができます。JetBrainsMono-2.242.zip を JetBrains Mono のサイトから手動で ~/Downloads/ へダウンロードしておきます。

フォントのインストール用スクリプト install_fonts.sh を用意します。

#! /bin/sh
url=https://github.com/miiton/Cica/releases/download/v5.0.2
cica_file=Cica_v5.0.2_with_emoji.zip
curl -L -o ~/Downloads/${cica_file} ${url}/${cica_file}
mkdir -p ~/.fonts/Cica
mkdir -p ~/.fonts/JetBrainsMono
cd ~/.fonts/Cica/
if [ -e ~/Downloads/${cica_file} ]; then
  unzip ~/Downloads/${cica_file}
fi
cd ../JetBrainsMono/
if [ -e ~/Downloads/JetBrainsMono-2.242.zip ]; then
  unzip ~/Downloads/JetBrainsMono-2.242.zip
fi
fc-cache -fv

これを実行するとフォントが使えるようになります。

$ sh install_fonts.sh
(略)

下記のような ttf ファイルが手に入ります。

$ ls -1 ~/.fonts/Cica/*.ttf
Cica-Bold.ttf
Cica-BoldItalic.ttf
Cica-Regular.ttf
Cica-RegularItalic.ttf
$ ls -1 ~/.fonts/JetBrainsMono/fonts/ttf/
JetBrainsMono-Bold.ttf
JetBrainsMono-BoldItalic.ttf
JetBrainsMono-ExtraBold.ttf
JetBrainsMono-ExtraBoldItalic.ttf
JetBrainsMono-ExtraLight.ttf
JetBrainsMono-ExtraLightItalic.ttf
JetBrainsMono-Italic.ttf
JetBrainsMono-Light.ttf
JetBrainsMono-LightItalic.ttf
JetBrainsMono-Medium.ttf
JetBrainsMono-MediumItalic.ttf
JetBrainsMono-Regular.ttf
JetBrainsMono-SemiBold.ttf
JetBrainsMono-SemiBoldItalic.ttf
JetBrainsMono-Thin.ttf
JetBrainsMono-ThinItalic.ttf
JetBrainsMonoNL-Bold.ttf
JetBrainsMonoNL-BoldItalic.ttf
JetBrainsMonoNL-ExtraBold.ttf
JetBrainsMonoNL-ExtraBoldItalic.ttf
JetBrainsMonoNL-ExtraLight.ttf
JetBrainsMonoNL-ExtraLightItalic.ttf
JetBrainsMonoNL-Italic.ttf
JetBrainsMonoNL-Light.ttf
JetBrainsMonoNL-LightItalic.ttf
JetBrainsMonoNL-Medium.ttf
JetBrainsMonoNL-MediumItalic.ttf
JetBrainsMonoNL-Regular.ttf
JetBrainsMonoNL-SemiBold.ttf
JetBrainsMonoNL-SemiBoldItalic.ttf
JetBrainsMonoNL-Thin.ttf
JetBrainsMonoNL-ThinItalic.ttf

さっき用意した Java のプログラムでこれらのフォントのファミリーネームがどうなっているのかを確認します。

$ java FontList |grep Cica
Cica
$ java FontList |grep JetBrains
JetBrains Mono
JetBrains Mono ExtraBold
JetBrains Mono ExtraLight
JetBrains Mono Light
JetBrains Mono Medium
JetBrains Mono NL
JetBrains Mono NL ExtraBold
JetBrains Mono NL ExtraLight
JetBrains Mono NL Light
JetBrains Mono NL Medium
JetBrains Mono NL SemiBold
JetBrains Mono NL Thin
JetBrains Mono SemiBold
JetBrains Mono Thin

これで、Cica とか、JetBrasins Mono といった指定が bluej.menu.font などにできることがわかります。

次に必要なフォントファイルを /usr/share/bluej/fonts/ へコピーします。ここではフォントファイル名とフォント名との対応まで調べる時間がなかったので、全部コピーしています。本当はディスク容量のことを考えると、必要なものだけにしたいところです。

sudo cp \
  ~/.fonts/Cica/*.ttf \
  ~/.fonts/JetBrainsMono/fonts/ttf/*.ttf \
  /usr/share/bluej/fonts/

これで BlueJ を起動すると、メニューが日本語になります。めでたし、めでたしー。

ちなみに、起動された BlueJ のプロセスを確認すると、起動コマンドは下記と同様になっていました。Java11 で実行できるようです。また、JavaFX を使っているのですね。

CP=/usr/share/bluej/bluej.jar
CP=$CP:/usr/share/java/javafx-base-11.jar
CP=$CP:/usr/share/java/javafx-controls-11.jar
CP=$CP:/usr/share/java/javafx-fxml-11.jar
CP=$CP:/usr/share/java/javafx-graphics-11.jar
CP=$CP:/usr/share/java/javafx-media-11.jar
CP=$CP:/usr/share/java/javafx-properties-11.jar
CP=$CP:/usr/share/java/javafx-swing-11.jar
CP=$CP:/usr/share/java/javafx-web-11.jar
/usr/lib/jvm/java-11-openjdk-armhf/bin/java \
  -Djavafx.embed.singleThread=true \
  -Dawt.useSystemAAFontSettings=on \
  -Xmx512M \
  -cp $CP \
  bluej.Boot \
   -javafxpath=/usr/share/java \
   -javafxjars=$CP

BlueJ のフォントについての情報が全然ありませんでしたが、日本では、あまり使われていないのですかね。

同じタグの記事: BlueJ
同じタグの記事: Raspberry Pi
同じカテゴリの記事: Java
同じカテゴリの記事: Linux