Никога преди не съм използвал 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 не се задават.