Javaアプリのフォント
環境によってはJavaアプリの一部で、以下のように英数字が何故かイタリックで表示される現象が発生します。本来表示されるUIは、以下のUIです。
発生条件
以下の条件で発生します。JRE
Open JDK 7以降Oracle Java 7以降
いずれも6では発生しない。
Look & Feel
GTK(UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"))
その他
Un series Korean TrueType fonts(fonts-unfonts-core)がインストールされているこのフォントは韓国語のフォントです。
回避策
根本的な対策ではありません。回避方法 その1
Un series Korean TrueType fontsをアンインストールします。Ubuntuソフトウェアセンターを起動し、「fonts-unfonts-core」で検索します。
ただしこのパッケージが他のパッケージの依存パッケージになっている場合、そのパッケージもアンインストールされます。
私の環境では、そのようなパッケージはありませんでした。
自分で意図的にインストールしたことがなくても、推奨パッケージ等でインストールされている可能性があります。
ちなみに以下の韓国語フォントでは現象が発生しませんでした。
状況にもよりますが、代替利用としてありかもしれません。
回避方法 その2
JavaのfontconfigファイルをOracle Java 6からコピーします。ただしこの方法はJavaのフォントマッチングを変更してしまうため、既存のJavaアプリのフォントが崩れたり、将来不具合が修正された際に不都合が発生する可能性があります。
コピーするファイル
fontconfig. Ubuntu. bfc
fontconfig.Ubuntu. properties. src
いずれも「/usr/lib/jvm/java-6-oracle/jre/lib」にあります。
コピー先
コピー先はJREにより異なります。以下のパスはすべて64bit版です。
Open JDK 7:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib
Oracle Java 7:/usr/lib/jvm/java-7-oracle/jre/lib
Oracle Java 8:/usr/lib/jvm/java-8-oracle/jre/lib
状況確認
OpenJDK 7で確認した内容です。ただし原因は把握できていません。
Ubuntuのデフォルトフォント
アプリ側からフォントを明示的に指定していないため、Ubuntuのデフォルトのフォントが利用されます。デフォルトのフォントは変更していない限り、「Ubuntu」フォントでサイズは11ptになります。
以下は確認用のコードと実行結果です。 現状の発生如何にかかわらず結果は同じです。
コード
String s = (String)LookAndFeel.getDesktopPropertyValue("gnome.Gtk/FontName",0);System.out.println(s);
実行結果
Ubuntu 11フォント名が「Ubuntu」でフォントサイズは11ptです。
これは正しい結果です。
ラベルが利用するフォント
次にラベルが利用しているフォントを調べました。現象が発生している状況と未発生の状況では以下のようになりました。
赤字の箇所が結果が異なる箇所です。
コード
System.out.println(myLabel.getFont());System.out.println(myLabel.getFont().getSize());
System.out.println(myLabel.getFont().getPSName());
System.out.println(myLabel.getFont().getName());
System.out.println(myLabel.getFont().getFontName());
System.out.println(myLabel.getFont().getFamily());
System.out.println(myLabel.getFont().isPlain());
System.out.println(myLabel.getFont().isBold());
System.out.println(myLabel.getFont().isItalic());
myLabelはJLabelのインスタンスです。
実行結果(現象発生)
javax.swing.plaf.FontUIResource[family=Ubuntu,name=Ubuntu,style=plain,size=15]15
Ubuntu Italic
Ubuntu
Ubuntu Italic
Ubuntu
true
false
false
赤字の箇所がなぜかItalicになっています。
実行結果(現象未発生)
javax.swing.plaf.FontUIResource[family=Ubuntu,name=Ubuntu,style=plain,size=15]15
Ubuntu
Ubuntu
Ubuntu
Ubuntu
true
false
false
ちなみにFontManager.findFont2Dで検索したFont2Dは、以下のようになっていました。
** TrueType Font: Family=Ubuntu Name=Ubuntu Italic style=2 fileName=/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-RI.ttf
余談ですがフォントサイズが11ではなく15になっているのは、Java内部は72dpiになっており、Toolkit.getDefaultToolkit().getDesktopProperty("gnome.Xft/DPI");で取得した値からスケーリングしているためです。
私の環境では96dpiでした。
fontconfig
fonts-unfonts-coreをインストールすると、「/etc/fonts/conf.d/90-fonts-unfonts-core.conf」がインストールされます。このファイルを削除しPCを再起動後現象の確認を行いましたが、結果は変わらずイタリックになる現象が発生しました。
Java側のフォントマッチングの問題なのかもしれません。
参考情報
Fat fonts in Swing applications2013/2/17
環境によっては、ディストリビューションのアップデートとしてインストールされることがあります。アップデートでUn series Korean TrueType fontsインストール後に、現象の確認を行うとイタリックになる現象が発生しました。
Un series Korean TrueType fontsを再度削除すると、現象が起きなくなりました。
また、Un series Korean TrueType fontsを削除しても他のパッケージの削除等の影響はありませんでした。