UIDefaults

自分でGUIを設定、描画する際、例えば色を設定する場合はその絶対値を指定してしまうとルックアンドフィールの変更に対応できなくなってしまうので、UIManagerを通して取得したシステム値(というか、スタイル/テーマといった方が解りやすいか)値をセットしておくのが常套なのだが、その値を取得するキーはどこかに一覧が出ている訳ではないので自分で調べる必要がある。

myComponent.setForeground(UIManager.getColor("Table.selectionForeground"));

以下は現在のプラットホームにおけるルックアンドフィールのデフォルト値(色、アイコン、フォント、etc)を列挙するコード。(内部の実装のせいなのか、keySet()を使ってforループで回すのでは上手くいかなかった)

public static void main(String[] args) {
    UIDefaults uidefs  = UIManager.getDefaults();
    Enumeration keys = uidefs.keys();
    while(keys.hasMoreElements()){
        Object key = keys.nextElement();
        Object value = uidefs.get(key);
        System.out.println(key + "=" + value);
    }
    System.exit(0);
}

実行結果

TabbedPane.textIconGap=4
ButtonUI=javax.swing.plaf.metal.MetalButtonUI
RootPane.questionDialogBorder=javax.swing.plaf.metal.MetalBorders$QuestionDialogBorder@12ac982
FormattedTextField.margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0]
RootPane.colorChooserDialogBorder=javax.swing.plaf.metal.MetalBorders$QuestionDialogBorder@1389e4
DesktopIcon.foreground=sun.swing.PrintColorUIResource[r=51,g=51,b=51]
CheckBoxMenuItem.border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@c20e24
TabbedPane.contentOpaque=true
:
:

..実際にはソートしないと使い物にならないかな。

以下のようにGUIで値を表示するアプリケーションもある。

こちらはサポートしているルックアンドフィール毎に切り替えることもできて見やすい(かな)