设置所有子组件的属性

时间:2009-05-23 19:51:09

标签: java awt

我以前从未使用过Java AWT,现在我有一段显示JFrame的代码,并将所有子组件的字体属性设置为相同的值。我想在仅限一个地方设置该属性。我怎么能这样做?

在.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);
    }
}

然而,它有四个缺点:

  1. 额外代码,对于具有嵌套布局面板的大型表单,这实际上可能效率很低。
  2. 代码是非通用的。如果我将来需要对另一个属性做同样的事情,我必须重写该方法(或者以简洁为代价重构它以更加通用)。
  3. 用法是非声明性的,即必须在表单创建的最后(在所有子组件初始化和添加之后)调用,而不是以声明方式在任何地方调用。
  4. 它不起作用。组件设置正确但并非所有组件都是组件。例如,TitledBorder的{​​{1}} s未设置。

2 个答案:

答案 0 :(得分: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()来查看设置的键和值。

答案 1 :(得分:1)

对于Swing,您还可以使用命令行参数设置字体:

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

为抗锯齿添加-Dswing.aatext=true,这使整个GUI看起来更好。 :)