2012年2月17日金曜日

java : Look&feelの設定でGUI全体のフォントサイズを変更

だいぶ前のコードを漁っていたら、Look&feelの設定を変えてGUI全体のフォントサイズを指定する方法が見つかりました。

import java.awt.Component;
import javax.swing.JComponent;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;

public class UiCustomizer
{
    public static void setFontSize(final int fontSize)
    {
        UIDefaults defaultTable = UIManager.getLookAndFeelDefaults();
        for(Object o: defaultTable.keySet() )
        {
            if(o.toString().toLowerCase().endsWith("font") )
            {
                FontUIResource font = (FontUIResource)UIManager.get(o);
                font = new FontUIResource(font.getName(), font.getStyle(), fontSize);
                UIManager.put(o, font);
            }
        }
    }

    public static void setScrollBarWidth(final int width)
    {
        UIManager.put("ScrollBar.width", width);
    }

    public static void updateUiAll(JComponent component)
    {
        for(Component child : component.getComponents() )
        {
            if(child instanceof JComponent)
            {
                JComponent updateComp = (JComponent)child;
                updateComp.updateUI();
                updateUiAll(updateComp);
            }
        }
    }
}

setFontSizeをswingコンポーネント作成前に指定すれば、以降に作ったコンポーネントは全て指定したフォントサイズになります。 Look&feelの設定ということでコンポーネントのインスタンスは必要ありません。 mainメソッド開始直後に呼べばOKです。 JTableの行の高さはフォントサイズに連動しないので注意。

スクロールバーの幅を変えるコードも混ざってますね。 それはまぁ、見ての通りです。

すでに作ってあるswingコンポーネントのフォントサイズを変更する場合、setFontSize → updateUiAllの順に呼び出します。 updateUiAllメソッドは子孫のLook&feel全部をアップデートです。 JFrameのUIをアップデートする場合はgetRootPaneを渡します。

個別のコントロールを設定する必要がないのでちょっと楽。 ただし、独自にフォントを設定しているコントロールが混ざっていると、そのコントロールだけフォントサイズが反映されません。