Задайте свойство за всички дъщерни компоненти

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

Той обаче има четири недостатъка:

  1. Допълнителен код, който всъщност може да е доста неефективен за големи форми с вложени панели за оформление.
  2. Кодът не е общ. Ако трябва да направя същото за друго свойство в бъдеще, трябва да пренапиша метода (или да го преработя, за да бъде по-общ за сметка на сбитостта).
  3. Използването е недекларативно, т.е. трябва да се извика в самия край на създаването на формуляра (след като всички дъщерни компоненти са инициализирани и добавени), вместо където и да е по декларативен начин.
  4. Не работи. Компонентите са зададени правилно, но не всички неща са компоненти. Например TitledBorders от JPanels не се задават.

person Konrad Rudolph    schedule 23.05.2009    source източник


Отговори (2)


Класът UIManager е нещото, от което се нуждаете. Преди да създадете своя потребителски интерфейс, просто му кажете какви шрифтове искате. Бъдете предупредени все пак; има много дефинирани клавиши за шрифтове и ако искате да ги промените всички, ще трябва да ги зададете всички.

UIManager.put( "Button.font", new Font( "Verdana", Font.BOLD, 12f );
UIManager.put( "Label.font", new Font( "Wingdings", Font.ITALIC, 12f );
// ...etc...

Можете да видите ключовете и стойностите, които са зададени чрез програмна проверка на UIManager.getDefaults(), който връща хеш-таблица.

person banjollity    schedule 23.05.2009
comment
Благодаря, това изглежда доста гъвкаво. - person Konrad Rudolph; 24.05.2009

За Swing можете също да зададете шрифтовете с аргументи от командния ред:

# java -Dswing.plaf.metal.controlFont=Georgia -Dswing.plaf.metal.userFont=Tahoma -jar foo.jar foo.Foo

Добавете -Dswing.aatext=true за антиалиасинг, което прави целия GUI да изглежда много по-хубав. :)

person Bombe    schedule 24.05.2009