Я никогда раньше не использовал 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
s изJPanel
s не устанавливаются.