代码之家  ›  专栏  ›  技术社区  ›  Konrad Rudolph

为所有子组件设置属性

  •  4
  • Konrad Rudolph  · 技术社区  · 15 年前

    我以前从未使用过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 S的 JPanel 我们不准备。
    2 回复  |  直到 15 年前
        1
  •  8
  •   banjollity    15 年前

    这个 UIManager 上课是你需要的。在构建用户界面之前,只需告诉它您想要什么字体。但是要注意,定义了很多字体键,如果你想全部更改它们,就必须全部设置。

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

    您可以看到通过编程检查uimanager.getdefaults()设置的键和值,该函数返回哈希表。

        2
  •  1
  •   Bombe    15 年前

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

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

    添加 -Dswing.aatext=true 对于消除混叠,使整个图形用户界面看起来更好。:)