我以前从未使用过 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);
}
}
但是,它有四个缺点:
- 额外的代码,这对于带有嵌套布局面板的大型表单实际上可能效率很低。
- 代码是非通用的。如果将来我需要对另一个属性执行相同的操作,我必须重写该方法(或重构它以使其更通用,但会牺牲简洁性)。
- 使用是非声明性的,即必须在表单创建的最后调用(在初始化和添加所有子组件之后),而不是以声明方式在任何地方调用。
- 它不起作用。组件设置正确,但并非所有东西都是组件。例如,
JPanel
的TitledBorder
未设置。
最佳答案
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/