4

以前は Java AWT を使用したことがありませんでしたが、すべての子コンポーネントJFrameの font プロパティを表示して同じ値に設定するコードを手に入れました。プロパティを1 か所だけに設定したい。これどうやってするの?

.NET/WinForms では、子コントロールは親コントロールから継承するため、Formインスタンスのフォントを設定してすべてのコントロールに伝播させるだけで十分です。予想外に、これは AWT には当てはまらないようです。

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

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 つの欠点があります。

  1. 入れ子になったレイアウト パネルを含む大きなフォームでは、実際には非常に非効率的な余分なコード。
  2. コードは非汎用です。将来、別のプロパティに対して同じことを行う必要がある場合は、メソッドを書き直す必要があります (または、簡潔さを犠牲にしてより一般的なものにリファクタリングする必要があります)。
  3. 使用法は非宣言的です。つまり、宣言的な方法ではなく、フォーム作成の最後 (すべての子コンポーネントが初期化および追加された後) に呼び出す必要があります。
  4. うまくいきません。コンポーネントは正しく設定されていますが、すべてがコンポーネントであるとは限りません。たとえば、TitledBorderの はJPanel設定されません。
4

2 に答える 2

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() をプログラムで検査することで、設定されているキーと値を確認できます。

于 2009-05-23T22:00:54.233 に答える
1

Swing の場合、コマンドライン引数を使用してフォントを設定することもできます。

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

-Dswing.aatext=trueGUI全体の見栄えを良くするアンチエイリアスを追加します。:)

于 2009-05-24T12:37:02.760 に答える