java - 为所有子组件设置属性

标签 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. 它不起作用。组件设置正确,但并非所有东西都是组件。例如,JPanelTitledBorder 未设置。

最佳答案

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

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

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

关于java - 为所有子组件设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/902326/

相关文章:

java - JProgressBar 绘画问题

java - Maven - repo.spring.io 为 Spring 里程碑依赖项提供 404

java - 从 Java 应用程序发送邮件

java - 如何更改 Java AWT 和/或 Swing 中的光标图像?

java - 鼠标右键事件

java - 打印时设置横向

java - GridBagLayout:如何设置固定列宽?

java - Android Studio 中的 ScrollView,同时使用上拉刷新

java - 使 JFrame 标题栏不计入像素

Java GetFile 在使用 SetFile 后返回不正确的文件名