- blogs:
- cles::blog

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 を使います。例えば以下のような感じです。
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
† 100%, 150%, 200% の Nimbus LAF
† 100%, 150%, 200% の Windows LAF
† 高 DPI と Windows LAF は相性が良くない
Windows LAF の場合だけシステムの設定につられてアプリ内部のフォントの大きさが変わっているのが分かります。このため、ウィンドウの左上にあるアイコンが欠けて表示されています。そんなわけで、高 DPI 環境では Windows LAF を使うのはレイアウト適に良くないということが分かります。
これを無理矢理回避するためには、例えば java の起動オプションに -D オプションを追加して swing.systemlaf を上書きしてやる方法があります。これにより LAF を強制的に差し替えることができます(ただし、アプリの作りによっては効かないこともあります)。ただ、Nimubus や Metal と Windows LAF はそもそものコンポーネントの大きさが違うので、やはりレイアウトが崩れてしまうのが問題になります。
† 高 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 を指定してやります。
上記の同じテストをこの PlasticXP LAF を使ってやってみると以下のようになります。
わかりやすいように上段が通常の Windows、下段が PlasticXP LAF にしてあります。
これだと高 DPI でも綺麗に表示されていますね。
というわけで Swing アプリの延命はこの PlasticXP LAF を使うと良さそうです。
- *1: 画面上のテキストを大きくまたは小さくする
- *2: 121ware.com > サービス&サポート > Q&A > Q&A番号 013904
- *3: UIManager (Java Platform SE 7 )
- *4: Nimbusルック・アンド・フィール
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/7305
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110685)
3 . 年次の人間ドックへ(110308)
4 . 2023 年分の確定申告完了!(1つめ)(109857)
5 . 三菱鉛筆がラミーを買収(109758)