torutkのブログ

ソフトウェア・エンジニアのブログ

Nimbus Look and Feel

Nimubs Look and Feelを使うと、プログラム側で制御している背景色の設定が反映されないものがあります。

  • だめな例:JTextFieldのbackground、JButtonのbackground
  • いける例:JLabelのbackground

XMLベースのSynthを使っているとの話しですが、そのためなのでしょうか。調べてみると、以下BugIDとその関連IDにおける記述にNimbusの設計概念が簡単に記述されていました。

Bug ID: JDK-6636230 Nimbus L&F: Basic components should be non-opaque to solve deffinition of backgound color

フォーカス描画や丸っこい角の描画を行うすべてのNimbus部品はデフォルトで透過となっている。背景はグラディエーション描画をするため、backgroundで塗りつぶすのではなく複雑な描画ロジックで実現されているようです。

 この描画ロジックは、"Painter"と呼ばれるステートレスなクラスに実装されており、PainterオブジェクトはUIDefaultsテーブルに格納されているので、好みによって置き換えられるようになっているとのこと。

 Painterを置き換えなくても、色、アイコン、フォント設定はUIDefaultsのテーブルを変更すればよいとのこと。しかし、JDK 6 Update 10 build 09での実装でNimbusLookAndFeel用のUIDefaultsに格納されているキー"TextField.background"の値は
パッケージスコープのクラス sun.swing.plaf.nimbus.DerivedColorであり、これをパッケージ外部から変更するのは困難です。今後はどうなるのかな?

Nimbus Look And Feelの使用方法

1) コマンドライン・オプションで指定する
C:\Users\torutk> java -Dswing.defaultlaf=sun.swing.plaf.nimbus.NimbusLookAndFeel -jar MyApp.jar
2) JREのプロパティファイルで記述

そのJREで実行するプログラムはデフォルトで記述したルック・アンド・フィールが適用されます。
JDK 6 UpdateNをC:\java\jdk1.6.0_10にインストールした場合、C:\java\jdk1.6.0_10\jre\lib\swing.propertiesファイルに記述します。

swing.defaultlaf=sun.swing.plaf.nimbus.NimbusLookAndFeel
3) プログラム中で記述
import javax.swing.UIManager;

    :
    UIManager.setLookAndFeel("sun.swing.plaf.nimbus.NimbusLookAndFeel");