4

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

在 .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. 它不起作用。组件设置正确,但并非所有东西都是组件。例如,TitledBorders 的JPanels 没有被设置。
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=true抗锯齿,使整个 GUI 看起来更好。:)

于 2009-05-24T12:37:02.760 回答