设置所有子组件的属性

Kon*_*lph 4 java awt

我之前从未使用过Java AWT,现在我有一段代码显示JFrame并将所有子组件的font属性设置为相同的值.我想把物业放在一个地方.我怎样才能做到这一点?

在.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,它有四个缺点:

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

ban*_*ity 8

UIManager的类是你需要的东西.在构建用户界面之前,只需告诉它您想要的字体.但要注意; 定义了很多字体键,如果你想更改它们,你必须全部设置它们.

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

您可以通过编程检查返回哈希表的UIManager.getDefaults()来查看设置的键和值.