Я никогда раньше не использовал 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);
}
}
Однако у него есть четыре недостатка:
- Дополнительный код, который может быть весьма неэффективным для больших форм с вложенными панелями макета.
- Код не является универсальным. Если в будущем мне понадобится сделать то же самое для другого свойства, мне придется переписать метод (или изменить его, чтобы он был более общим за счет краткости).
- Использование не декларативно, то есть должно вызываться в самом конце создания формы (после того, как все дочерние компоненты были инициализированы и добавлены), а не где-либо декларативным образом.
- Не работает. Компоненты установлены правильно, но не все вещи являются компонентами. Например,
TitledBorder
с JPanel
с не установлены.