2009-05-23 7 views
4

これまでJava AWTを使用したことがなく、JFrameを表示し、のすべての子コンポーネントのフォントプロパティを同じ値に設定しました。私はに1つの場所だけを設定したいと考えています。これどうやってするの?すべての子コンポーネントのプロパティを設定する

.NET/WinFormsでは、子コントロールは親コントロールから継承するため、Formインスタンスのフォントをすべてのコントロールに反映させるには十分です。予期しないことに、これはAWTのために成り立たないようです。

次の小さなコードを再帰的にすべてのコンポーネントのフォントを設定します。

  1. 余分なコード、実際には、ネストされたとの大規模な形態のため、非常に非効率的であるかもしれない。しかし

    private void setFontForAll(JFrame f, java.awt.Font font) { 
        f.setFont(font); 
        setFontRecursive(f.getContentPane().getComponents(), font); 
    } 
    
    private static void setFontRecursive(Component[] components, java.awt.Font font) { 
        for (Component c : components) { 
         c.setFont(font); 
         if (c instanceof java.awt.Container) 
          setFontRecursive(((java.awt.Container)c).getComponents(), font); 
        } 
    } 
    

    、それは4つの欠点を有していますレイアウトパネル。

  2. コードは非ジェネリックです。私が将来別のプロパティのために同じことをする必要がある場合、私はメソッドを(またはリファクタリングする必要がありますより一般的に簡潔さを犠牲にして)。
  3. 使用方法は宣言的ではなく、フォーム作成の最後に(すべての子コンポーネントを初期化して追加した後に)呼び出す必要があります。
  4. 動作しません。コンポーネントは正しく設定されていますが、すべてがコンポーネントではありません。たとえば、TitledBorderJPanelは設定されません。

答えて

8

クラスUIManagerクラスは必要なものです。ユーザーインターフェイスを構築する前に、必要なフォントを教えてください。しかし、警告してください。多くのフォントキーが定義されており、それらをすべて変更したい場合は、それらをすべて設定する必要があります。

UIManager.put("Button.font", new Font("Verdana", Font.BOLD, 12f); 
UIManager.put("Label.font", new Font("Wingdings", Font.ITALIC, 12f); 
// ...etc... 

あなたは、プログラムのハッシュテーブルを返しますUIManager.getDefaults()を検査することで設定されたキーと値を見ることができます。

+0

ありがとう、それは多目的に見えます。 –

1

スイングのために、あなたはまた、コマンドライン引数でフォントを設定することができます。

# java -Dswing.plaf.metal.controlFont=Georgia -Dswing.plaf.metal.userFont=Tahoma -jar foo.jar foo.Foo 

は全体のGUIは、多くが立派に見えるアンチエイリアシングのため-Dswing.aatext=trueを追加します。 :)

関連する問題