BLOGTIMES
2015/01/02

Swing と High DPI 環境の微妙な関係

  java 
このエントリーをはてなブックマークに追加

テキストやその他の項目の大きさの変更 - Swing と High DPI 環境の微妙な関係

Surface Pro 3の液晶は 12型の2160×1440(216ppi)という普段使いの PC としては必要以上に超高精細な画面が採用されています。普段のデスクトップが23型で1920×1080であることを考えると、その差は歴然で、ピクセル原寸表示では文字が小さすぎて実用的ではありません。

当然のことながら、高精細な画面を生かしつつ、システム的には文字を大きく表示するようにして使うことになります。具体的にはコントロールパネルにある、テキストやその他の項目の大きさの変更*1*2を使って文字の大きさを調整することになります。通常の液晶では既定値は100%のところになっているはずですが、Surface Pro 3 では 大(150%) の部分が既定値になっています。

ほとんどのアプリではこの設定で特に問題は生じないのですが、Java の Swingで作られたアプリ(Look&Feel が Windows 指定されているもの)で、うまくレンダリングされないアプリがあることに気づきました。そのようなアプリは前述の設定を 小(100%) に戻してやると上手くレンダリングされるのですが、アプリを切り替えるたびにこの値をいじるのは、切り替えにログアウトが必要になる関係で得策ではありません。というわけで、Swing の Look & Feel と高 DPI 環境の関係について少し調べてみました。

Look & Feel の切り替え方

Swing での Look & Feel (LAF)の切り替えは UIManager.setLookAndFeel()*3 を使います。例えば以下のような感じです。

UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

Windows でよく使われているLAFはデフォルトの Metal (javax.swing.plaf.metal.MetalLookAndFeel)のほかに、Java6 から追加された Nimbus (javax.swing.plaf.nimbus.NimbusLookAndFeel)*4、そして Windows (com.sun.java.swing.plaf.windows.WindowsLookAndFeel)でしょうか。これをそれぞれ 小(100%)、大(150%)、特大(200%)に設定変更してスクリーンショットを撮ってみます。

100%, 150%, 200% の Metal LAF

Metal 100% - Swing と High DPI 環境の微妙な関係
Metal 150% - Swing と High DPI 環境の微妙な関係
Metal 200% - Swing と High DPI 環境の微妙な関係

100%, 150%, 200% の Nimbus LAF

Nimbus 100% - Swing と High DPI 環境の微妙な関係
Nimbus 150% - Swing と High DPI 環境の微妙な関係
Nimbus 200% - Swing と High DPI 環境の微妙な関係

100%, 150%, 200% の Windows LAF

Windows 100% - Swing と High DPI 環境の微妙な関係
Windows 150% - Swing と High DPI 環境の微妙な関係
Windows 200% - Swing と High DPI 環境の微妙な関係

高 DPI と Windows LAF は相性が良くない

Windows LAF の場合だけシステムの設定につられてアプリ内部のフォントの大きさが変わっているのが分かります。このため、ウィンドウの左上にあるアイコンが欠けて表示されています。そんなわけで、高 DPI 環境では Windows LAF を使うのはレイアウト適に良くないということが分かります。

これを無理矢理回避するためには、例えば java の起動オプションに -D オプションを追加して swing.systemlaf を上書きしてやる方法があります。これにより LAF を強制的に差し替えることができます(ただし、アプリの作りによっては効かないこともあります)。ただ、Nimubus や Metal と Windows LAF はそもそものコンポーネントの大きさが違うので、やはりレイアウトが崩れてしまうのが問題になります。

java -Djavax.swing.plaf.nimbus.NimbusLookAndFeel -jar ・・・・

高 DPI 対応な Windows LAF が欲しい

こうなってくると、高 DPI 対応な Windows LAF が欲しいということになるわけですが、そんな都合の良いものは標準で用意されている訳もなく、ちょっと困ってしまったのですが、いろいろサイトを探すうちに JGoodies Looks というプロジェクトを見つけました。

JGoodies Looks | JGoodies

Our Windows look&feel focuses on a precise emulation on Windows 95, 98, NT, ME, 2000, XP, Vista, 7, and now Windows 8 in the following areas: menus, icons, colors, borders, fonts, font sizes, insets, and widget dimensions. It honors the screen resolution (96dpi vs. 120 dpi) to adjust sizes, insets, and widget dimensions.

この LAF を使うためには jgoodies-common と jgoodies-looks が必要なようなので、これらをダウンロードしてクラスパスを通してやり、LAF として com.jgoodies.looks.plastic.PlasticXPLookAndFeel を指定してやります。

java -Dswing.systemlaf=com.jgoodies.looks.plastic.PlasticXPLookAndFeel -cp jgoodies-common-1.8.0.jar -cp jgoodies-looks-2.6.0.jar -jar

上記の同じテストをこの PlasticXP LAF を使ってやってみると以下のようになります。
わかりやすいように上段が通常の Windows、下段が PlasticXP LAF にしてあります。

Windows 100% - Swing と High DPI 環境の微妙な関係
PlasticXP 100% - Swing と High DPI 環境の微妙な関係

Windows 150% - Swing と High DPI 環境の微妙な関係
PlasticXP 200% - Swing と High DPI 環境の微妙な関係

Windows 200% - Swing と High DPI 環境の微妙な関係
PlasticXP 150% - Swing と High DPI 環境の微妙な関係

これだと高 DPI でも綺麗に表示されていますね。
というわけで Swing アプリの延命はこの PlasticXP LAF を使うと良さそうです。


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/7305
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン