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